echo -e 'one two three\nfour five six\nseven eight nine'
one two three
four five six
seven eight nine
como faço para "MAGIC" obter essa saída ?:
three
six
nine
UPDATE: Não preciso dessa maneira específica, preciso de uma solução geral para que não importa quantas colunas estejam seguidas, por exemplo: awk sempre exibe a última coluna.
text-processing
awk
LanceBaynes
fonte
fonte
Respostas:
Ele pode até mesmo ser feito apenas com
'bash'
, sem'sed'
,'awk'
ou'perl'
:fonte
... | while read -r line; do echo ${line##* }; done
bash
O índice de matriz é objeto de avaliação aritmética, o queecho ${line[nb - 1]}
é suficiente. Como falarbash
, você pode simplesmente ignorar as coisas “NB”:echo ${line[-1]}
. Uma alternativa mais portátil da tarde:echo ${line[@]: -1]}
. (Veja comentário Stephane Chazelas' em índices negativos em outros lugares.)Experimentar:
fonte
ps -ef | awk '{ print $NF }'
algumas linhas foram truncadas ...) O Perl não tem essa limitação. ( gnu.org/software/autoconf/manual/autoconf-2.67/html_node/… : "O Awk tradicional tem um limite de 99 campos em um registro. Como algumas implementações do Awk, como as do Tru64, dividem a entrada mesmo que você não se refira para qualquer campo do script, para contornar esse problema, defina 'FS' com um caractere incomum e use split. ")awk
implementações têm essa limitação? Eu nunca vi isso. Minhamawk
vontade engasga,32768
mas a minhagawk
eigawk
pode lidar com milhões felizes. Até o meu busyboxawk
pode lidar com milhões. Eu nunca me deparei com umawk
que não possa lidar com 100 campos, afinal, é um número pequeno. Você tem certeza de que as informações ainda são relevantes? Mesmo no Solaris?É mais fácil do que você pensa.
fonte
Tente
grep
(mais curto / mais simples, mas 3x mais lento que oawk
uso de expressões regulares):Ou
ex
(ainda mais lento, mas imprime todo o buffer após o término, mais útil quando ele precisa ser classificado ou editado no local):Para mudar no local, substitua
-sc'%p|q!'
por-scwq
.Ou
bash
:atuação
Dado o arquivo de 1 GB gerado via:
Eu executei as estatísticas do tempo de análise (correu ~ 3x e fiz a menor, testei no MBP OS X):
usando
awk
:usando
grep
:usando
perl
:usando
rev
+cut
:usando
ex
:usando
bash
:fonte
fonte
-a
:, campos de divisão automática na@F
matriz;-l
corta$/
(separador de registro de entrada) e o salva em$\
(separador de registro de saída). Como nenhum número octal é fornecido-l
, o original$/
é aplicado na impressão (finais de linha);-n
código de loop;-e
execute o código imediatamente a seguir. Vejaman perlrun
.Também pode ser feito usando
'sed'
:Atualizar:
ou mais simplesmente:
fonte
Ou usando
cut
:embora isso não atenda ao requisito de 'solução geral'. Usando
rev
duas vezes, podemos resolver isso também:fonte
rev
não funciona com caracteres "largos", apenas caracteres de byte único, tanto quanto eu sei.Usando
awk
você, você pode primeiro verificar se há pelo menos uma coluna.fonte
awk 'NF{print $NF}'
.Em perl, isso pode ser feito da seguinte maneira:
saída:
Você também pode percorrer um arquivo, veja um exemplo de script que escrevi para analisar um arquivo chamado budget.dat
dados de exemplo em budget.dat:
(você pode ver que eu precisava capturar apenas a coluna "última", não apenas a coluna 2)
O script:
fonte