我的输入文件包含以下格式的内容:
ABCD XYZAB 1234
PQRSTUV STU SKIP
LMN OPRQM 8966
RSTUV OPM SKIP
TUV ZXU SKIP
我想解析这个文件并将其输出到一个新文件,使得最后一列为“SKIP”的行不会出现在最终输出文件中,如下所示:
ABCD XYZAB 1234
LMN OPRQM 8966
为了处理上述内容,我编写了以下shell脚本:
while read -r col1 col2 col3
do
if [ "$col3" != "SKIP" ]
then
printf "%s %s %s\n" "$col1" "$col2" "$col3";
fi
done <input.txt > output.txt
但是上面的脚本似乎不起作用,我的输出文件仍然继续包含所有行,在最后一列中有“SKIP”。我不明白为什么“条件”失败了?
谢谢, VJ
答案 0 :(得分:1)
好吧,虽然脚本是正确的,但正在编辑的输入文件是在Windows环境中。结果,行结尾是“\ r”而不是“\ n”。所以,那里有一个不匹配。因此,条件检查也失败了。一旦我将行结尾转换为UNIX格式,就会根据需要获得输出。感谢大家的帮助。
VJ
答案 1 :(得分:0)
VJ - 我的脚本没有任何问题。我粘贴了你的代码和输入,结果正是你想要的。请参阅我的笔记本电脑“ttt”下面的证据:
[ttt:/m/temp/stack] cat vjvj while read -r col1 col2 col3 do if [ "$col3" != "SKIP" ] then printf "%s %s %s\n" "$col1" "$col2" "$col3"; fi done output.txt [ttt:/m/temp/stack] cat input.txt ABCD XYZAB 1234 PQRSTUV STU SKIP LMN OPRQM 8966 RSTUV OPM SKIP TUV ZXU SKIP [ttt:/m/temp/stack] cat output.txt ABCD XYZAB 1234 LMN OPRQM 8966 [ttt:/m/temp/stack] cat /etc/lsb-release DISTRIB_ID=LinuxMint DISTRIB_RELEASE=13 DISTRIB_CODENAME=maya DISTRIB_DESCRIPTION="Linux Mint 13 Maya" [ttt:/m/temp/stack]