如果文件中有特定名称,则仅打印一次
我有个问题。这是我的脚本:
#!/bin/bash
file_name="eq3_luteina_horyzontalna"
file_name2="wiazanie_PO4"
tmp=$(mktemp) || exit 1
for index in {1..405000}
do
if ! [ -s "${file_name}_$index.ndx" ];then
echo "0" >> ${file_name2}_POP42.txt
else
awk '{if($2==/POP42/) print "5"; else print "0"}' ${file_name}_$index.ndx >> ${file_name2}_POP42.txt
fi
done
问题就在这里
awk '{if($2==/POP42/) print "5"; else print "0"}' ${file_name}_$index.ndx
我只想检查 POP42 是否在第二列的文件中并打印 5 但我有这样的数据
162 POP87
1851 POP42
所以它会打印到我的输出文件 ${file_name2}_POP42.txt 中,类似于:
0
5
但我想拥有
5
5
另一种情况
3075 POP42
2911 POP42
它将打印到输出
5
5
但我只想
我该如何管理我的问题?
回答
awk '$2=="POP42"{s=5; exit} END{print s+0}' file
顺便说一句 -$2==/POP42/不会做你认为它会做的事情,即寻找$2等于(甚至包含)的行POP42。它实际上是您使用$2==($0 ~ /POP42/ ? 1 : 0)的正则表达式分隔符的简写,它的/.../作用是查看匹配正则表达式的字符串是否POP42出现在当前行的任何位置,如果出现,则测试是否$2具有 value 1,否则测试是否$2具有值0。在使用 awk 时,了解 string ( ") 和 regexp ( /) 定界符以及 string (eg ==) 和 regexp (eg ~) 比较运算符之间的区别很重要。