首页 > 解决方案 > 如果文件中有特定名称,则仅打印一次

问题描述

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

#!/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

我该如何管理我的问题?

标签: bashawk

解决方案


awk '$2=="POP42"{s=5; exit} END{print s+0}' file

顺便说一句 -$2==/POP42/不做你认为它做的事,即寻找$2等于(甚至包含)的行POP42。它实际上是您使用$2==($0 ~ /POP42/ ? 1 : 0)的正则表达式分隔符的简写,它的作用是查看与正则表达式匹配的字符串是否出现在当前行的任何位置,如果出现,则测试是否有值,否则测试是否有价值。在使用 awk 时,了解字符串 ( ) 和正则表达式 ( ) 分隔符以及字符串 (eg ) 和正则表达式 (eg ) 比较运算符之间的区别很重要。/.../POP42$21$20"/==~


推荐阅读