imprimir linha específica de vários arquivos

4

Eu tenho uma coleção de mais de 5.000 arquivos e só quero criar um arquivo output.txt que contenha a 27ª linha de todos os arquivos junto com o nome do arquivo. O que recebi da Internet é escolher uma linha específica de um único arquivo usando os comandos awk ou sed como $sed -n 27p *.txt >>output.txt

por exemplo, meus arquivos em um diretório são:

log_1.txt
log_2.txt
log_3.txt
log_4.txt
.
.
.

Eu quero a 27ª linha de cada arquivo com o nome do arquivo na frente ou atrás da linha impressa no novo arquivo output.txt .

    
por Ravi Saini 18.04.2016 / 12:35

4 respostas

12
 awk 'FNR==27 {print FILENAME, $0}' *.txt >output.txt
  • FILENAME é a variável awk incorporada para o nome do arquivo de entrada atual
  • FNR refere-se ao número da linha do arquivo atual
  • $0 significa linha inteira
por 18.04.2016 / 12:48
2

Outra possibilidade é:

for i in * ; do echo -n $i" : "  ; head -n 27 "$i" | tail -n 1 ; done > output.txt
    
por 18.04.2016 / 13:32
2

Usando um loop for :

{ for i in *.txt; do echo "$i : $(sed -n '27p' "$i")"; done ;} >output.txt

O loop for pode ser caro, já que você tem mais de 5.000 arquivos, mas, considerando os hardwares atuais, isso não deve ser um problema.

De maneira mais rápida, parando sed após a linha 27 (obrigado @Fiximan) :

{ for i in *.txt; do echo "$i : $(sed -n '27p;q' "$i")"; done ;} >output.txt
    
por 18.04.2016 / 12:43
0

Uso de awk simples:

awk 'FNR==27 {print FILENAME,$0}' /path/to/files/log_*.txt > outfile.txt
    
por 18.04.2016 / 17:47