Como imprimir a segunda última linha de um arquivo usando o awk [duplicate]

3

Eu tenho vários arquivos com números ou registros diferentes em cada um. Eu quero um comando awk para imprimir a segunda última linha deles e realizar algumas alterações. Eu quero algo assim: (este não funciona, claro)

awk '( NR == FNR-1 ), $0","' *.txt
    
por Tejaswi N 22.05.2018 / 14:52

2 respostas

4

awk lê os registros como eles vêm e não tem noção de quão longe do final esses registros estão se ainda não os leu (registros extras podem muito bem ser adicionados depois de ler e processar o registro atual). / p>

Ao contrário de sed , ele não pode nem saber qual é o último registro ( sed tem o endereço $ que ele realmente implementa lendo internamente um registro antecipadamente para saber qual é o último). / p>

Você pode, no entanto, fazer algum processamento no final da instrução END especial, ou com o GNU awk , depois de ter processado cada arquivo de entrada (na instrução ENDFILE ).

Assim, você pode salvar os dois últimos registros enquanto os processa e, em seguida, na instrução END / ENDFILE , lembre-se do penúltimo de onde salvou.

Por exemplo:

awk '{prevlast = last; last = $0}
     END {if (NR >= 2) print "penultimate:", prevlast}' < input

Ou:

gawk '{prevlast = last; last = $0}
      ENDFILE {
       if (FNR >= 2) print "penultimate for", FILENAME ":", prevlast
      }' file1 file2

Ou generalizá-lo para o th do final:

awk -v n=2 '{saved[NR % n] = $0}
     END {if (NR >= n) print saved[(NR + 1) % n]}' < input

gawk -v n=2 '{saved[FNR % n] = $0}
     ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' file1 file2
    
por 22.05.2018 / 15:32
0

Para anexar a vírgula , no final da segunda à última linha com a modificação de cada arquivo no local.

sed solução:

Amostra file1.txt :

C2-C1 1.5183
C3-C2 1.49
C3-C1 1.4991
O4-C3 1.4104
C1-C2-C3 59.78

Amostra file2.txt :

C2-C1 1.5052
C3-C2 1.505
C3-C1 1.5037
S4-C3 1.7976
C1-C2-C3 59.95
sed -i 'x; ${s/.*/&,/;p;x}; 1d' file*.txt

Visualizando resultados:

$ head file[12].txt
==> file1.txt <==
C2-C1 1.5183
C3-C2 1.49
C3-C1 1.4991
O4-C3 1.4104,
C1-C2-C3 59.78

==> file2.txt <==
C2-C1 1.5052
C3-C2 1.505
C3-C1 1.5037
S4-C3 1.7976,
C1-C2-C3 59.95
    
por 22.05.2018 / 15:21

Tags