如何让 awk 在 while 循环中工作

如何让 awk 在 while 循环中工作
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 循环运行它,其中 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 等。

相关内容