whileループでawkを操作する方法

whileループでawkを操作する方法
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

whileループまたはif $? = 0(リターンコードを使用)ループを使用して実行できるようにしたいです。これを行う方法についてのアイデアはありますか?私はSolaris 5.10、KSHを使用しています。

答え1

入力ファイルを読み取りコマンドにパイプすると、災害が発生し、場合によっては機能しますが、多くの場合は機能しません。これを行うより一貫した方法を学ぶことをお勧めします。

以下はいくつかの簡単な選択肢です。

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

または繰り返したい場合...

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

これらの方法の利点は、フレーズを簡単に変更できることです。

$( cat input.txt )

..#記号の後にあるコメントを削除することで、ファイルリストにコメントを追加できます。例えば

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

ノート:スペースやタブを含むファイルパスを満た​​す必要がある場合は、bashをスキップしてperl、pythonなどのテキスト/トークンベースのスクリプト言語を使用しないことをお勧めします。

関連情報