我是bash命令的新手,我正在尝试创建一个for语句,将第6列(空格分隔)中值为3的每一行打印到文件中。我的语法如下:
for i in `cat test`
do
section=`echo ${i} | cut -d ' ' -f 6`
line=`echo ${i}`
if [ ${section} == "3" ];
then
echo ${line} > test.out
fi
done
不幸的是,这不起作用......任何人都可以告诉我这有什么问题吗?
答案 0 :(得分:2)
你没有以正确的方式阅读文件。
您可以尝试调试它:
for i in `cat file.txt`
echo $i
done
你会看到它在一个新行上打印每个单词,因为for循环实际上迭代文件中的每个单词,而不是每个行。
要逐行读取文件,请使用以下命令:
while IFS= read -r line
do
echo "$line"
done < file.txt
顺便说一下,如果你想要一个替代解决方案,你可以使用这个awk
单行:
awk '$6 == "3"' test > test.out
答案 1 :(得分:2)
主要问题实际上是
`cat`
你正在有效地读取整个文件,然后将它泵入``运算符,它在空格上分割。所以,你是不是处理线:你正在处理“单词”,因为shell定义了它们,一次一个。
尝试使用类似的东西:
( while read line ; do
section=`echo ${line} | cut -d ' ' -f 6`;
if [ "${section}" == "3" ]; then
echo ${line} > test.out;
fi
done ) < test