Como fazer o awk funcionar em um loop while

1
input.txt:
/usr/dir1/file1
/usr/dir1/file2
/usr/dir2/file4
/usr/dir3/file5

Script:
cat input.txt |while read FILENAME
do
nawk '{print $1}' ${FILENAME} >> output.txt
done

Expected output:
all column1 values of input files

Error:
nawk: can't open file

This works fine when i run it like this
nawk '{print $1}' /usr/dir1/file1 >> output.txt
nawk '{print $1}' /usr/dir1/file2 >> output.txt
nawk '{print $1}' /usr/dir2/file4 >> output.txt

Eu quero ser capaz de executá-lo usando um loop while ou um loop if com $ if = 0 (usando o código de retorno). Algumas ideias em como fazer isso? Estou usando o solaris 5.10, KSH.

    
por ayrton_senna 16.07.2015 / 22:58

1 resposta

1

A colocação de um arquivo de entrada em um comando de leitura geralmente é uma receita para o desastre, ele pode funcionar em algumas circunstâncias, mas em muitos casos isso não acontece. Melhor aprender uma maneira mais consistente de fazer isso.

Aqui estão algumas alternativas simples ...

nawk '{print $1}' $( cat input.txt ) > output.txt

ou se você quiser em um loop ...

for FILENAME in $( cat input.txt ); do
    nawk '{ print $1 }' $FILENAME >> output.txt
done

Essas abordagens têm a vantagem de você também alterar facilmente a frase

$( cat input.txt )

.. para algo que vai jogar fora comentários após um símbolo # que lhe dá a capacidade de adicionar comentários às suas listas de arquivos. por exemplo.

$( cat input.txt | sed 's/#.*//' )

OBSERVAÇÃO : Se você precisar fornecer caminhos de arquivo que contenham espaços ou tabulações, provavelmente precisará pular o bash e usar uma linguagem de script com menos texto / token, como perl, python, etc.

    
por 17.07.2015 / 01:28