如果文件中有特定名称,则仅打印一次

我有个问题。这是我的脚本:

#!/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 ~) 比较运算符之间的区别很重要。


以上是如果文件中有特定名称,则仅打印一次的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>