Como imprimo os últimos 5 campos no awk?

4

Eu tenho 10 campos e quero começar do campo 5 ao campo 10 e ignorar os 5 primeiros campos. Como posso usar o NF no awk para fazer isso?

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10

Eu quero mostrar apenas:

f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
    
por ASAD 22.12.2016 / 18:00

2 respostas

7

Você precisa percorrer os campos:

bash-4.3$ awk '{for(i=6;i<=NF;i++) printf $i" "; print ""}' input_file.txt 
f6 f7 f8 f9 f10 
c6 c7 c8 c9 c10 

Ou você pode tornar os campos iguais a uma string Nula:

bash-4.3$ awk '{for(i=1;i<=5;i++) $i="";print}' input_file.txt 
     f6 f7 f8 f9 f10
     c6 c7 c8 c9 c10

Ou use substring de toda a linha para imprimir todos os caracteres de onde o campo 6 começa (crédito para link ):

bash-4.3$ awk '{print substr($0,index($0,$6))}' input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

ou simplesmente use o comando cut :

bash-4.3$ cut -d " " -f6-10  input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

O Python também pode fazer isso:

bash-4.3$ python -c 'import sys;fields=[" ".join(line.strip().split()[5:]) for line in sys.stdin];print "\n".join(fields)' < input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

ou alternativamente:

$ python -c "import sys;print '\n'.join(map(lambda x:' '.join(x.split()[5:]),sys.stdin.readlines()))" < input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Ou com o Ruby:

bash-4.3$ ruby -ne 'print $_.split()[5..10].join(" ");print "\n"' < input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Bash + xargs também podem fazê-lo, embora um pouco mais complicado:

bash-4.3$ cat input_file.txt | xargs -L 1 bash -c 'arr=($@);for i in $(seq 5 10);do printf "%s " ${arr[$i]} ; done; echo' sh
f6 f7 f8 f9 f10  
c6 c7 c8 c9 c10 
    
por Sergiy Kolodyazhnyy 22.12.2016 / 18:09
3

Apenas processe os campos de interesse. Esse será o último campo -4, o último campo -3, até o último campo real.

Leitura de um arquivo com este conteúdo ( file.txt ):

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10

Execute o awk no arquivo conforme descrito abaixo. A linha com o sinal $ é o comando. As últimas duas linhas são a saída.

$ awk '{print $(NF-4)" "$(NF-3)" "$(NF-2)" "$(NF-1)" "$NF}' file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Nota : Como apontado por Cyrus no comentário, eu removi o script bash e deixei apenas a declaração print para torná-lo mais simples e rápido.

    
por L. D. James 22.12.2016 / 18:44