bash - 如果文件中有特定名称,则仅打印一次
问题描述
我有个问题。这是我的脚本:
#!/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
另一种情况
3075 POP42
2911 POP42
它将打印到输出
5
5
但我只想
5
我该如何管理我的问题?
解决方案
awk '$2=="POP42"{s=5; exit} END{print s+0}' file
顺便说一句 -$2==/POP42/
不做你认为它做的事,即寻找$2
等于(甚至包含)的行POP42
。它实际上是您使用$2==($0 ~ /POP42/ ? 1 : 0)
的正则表达式分隔符的简写,它的作用是查看与正则表达式匹配的字符串是否出现在当前行的任何位置,如果出现,则测试是否有值,否则测试是否有价值。在使用 awk 时,了解字符串 ( ) 和正则表达式 ( ) 分隔符以及字符串 (eg ) 和正则表达式 (eg ) 比较运算符之间的区别很重要。/.../
POP42
$2
1
$2
0
"
/
==
~