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