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
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