Você tem que entender que o >>
só redirecionará a parte do comando atual - basicamente apenas o número que é o resultado do comando começando com grep
e canalizado algumas vezes. echo $file
é um comando separado (você usa ;
) e, portanto, normalmente direciona para stdout. Tudo o que você precisa fazer é redirecionar após todo o loop:
for file in foo*.txt; do
echo $file
grep "some_text" $file | tail -n5 | awk '{print $2}'
done > bar2.csv
Se você quiser "versão" classificar seus arquivos (este é o nome apropriado), você pode listá-los após a classificação:
for file in $(ls foo*.txt | sort -V); do
para executar algo pequeno rapidamente (alguns minutos para ~ 1000 arquivos), isso deve ser bom.
EDITAR
Após o seu comentário, existem algumas soluções. Eu estou supondo que você quer:
file1 1
2
3
Basta soltar o echo
e alterar a linha de eco:
for file in foo*.txt; do
grep "some_text" $file | tail -n5 | awk -v f=$file '{if(NR==1) {printf("%-20s %-5s\n",f,\)} else {printf("%-20s %-5s\n","",$2)}}'
done > bar2.csv
Eu deixei awk
fazer a impressão para mim. Usando -v
me permite passar uma variável em f
. Para a impressão familiarize-se com a sintaxe printf
(você pode usar man printf
no shell. Basicamente, estou assumindo dois campos, um com 20, o outro 5 e um espaço entre. O sinal negativo à esquerda justifica. brincar com isso. Isso teria corrigido seu problema inicial, já que agora você pode canalizar aquela única linha.
Se você quer que o arquivo seja apenas:
file1,1
file1,2
...
file2,1
você pode largar a declaração if
no meu awk
ou deixar a solução inicial com o echo, mas use
echo -n "$file,"
onde -n
garante que nenhuma nova linha seja impressa.