awk 'FNR==27 {print FILENAME, $0}' *.txt >output.txt
-
FILENAMEé a variável awk incorporada para o nome do arquivo de entrada atual -
FNRrefere-se ao número da linha do arquivo atual -
$0significa linha inteira
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 .
Outra possibilidade é:
for i in * ; do echo -n $i" : " ; head -n 27 "$i" | tail -n 1 ; done > output.txt
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
Uso de awk simples:
awk 'FNR==27 {print FILENAME,$0}' /path/to/files/log_*.txt > outfile.txt