我为 awk 创建了一个脚本。我将循环“for”与“if”语句结合起来。它在每一行中搜索可能出现在行中不同位置的单词“ABC”。如下所示:
{for (i=1;i<=NF;i++) if ($i=="ABC") 打印$(i-2)}
当行中没有“ABC”时,问题就会出现,而我想打印有关它的信息。使用下面的脚本,它会为我提供行中每个单词的信息,这些单词与“ABC”不同,而我希望每行只有一个信息(而不是每个单词的信息)。
{for (i=1;i<=NF;i++) if ($i=="ABC") 打印 $(i-2)
else if ($i=="ABC") 打印“该行中没有 ABC”}
问候,卢卡斯
答案1
您已告诉脚本明确检查该行的每个字段(单词)。您要做的只是检查该行是否包含字符串 ABC:
awk '{
if(/ABC/){
printf "line %s contains ABC
}
else{
printf "line %s does not contain ABC\n",NR
}
}' file.txt
如果对包含以下内容的文件运行此命令:
this line has no string of interest
this line contains ABC somewhere
你得到:
line 1 does not contain ABC
line 2 contains ABC
您没有解释为什么要打印$(i-2)
,但如果这是您真正需要的,您可以这样做:
awk '{k=0; for (i=1;i<=NF;i++){
if ($i=="ABC"){print $(i-2); k++}
}
if(k==0){print "No ABC in line",NR}
}' file.txt
诀窍在于变量k
。它在每行开头设置为 0。当您浏览字段时,如果其中一个字段与 匹配ABC
,k
则设置为1
。因此,一旦处理完所有字段,如果k
仍为0
,则该行不包含任何内容ABC
,并打印一条消息。在上面给出的示例文件上运行此脚本将打印:
No ABC in line 1
line
答案2
isFound
尝试在循环前声明一个变量,名为for
。在 之后print $(i-2)
,设置isFound
为。用一个语句true
替换当前语句,说明 if is false then print 。elseif
if
isFound
no ABC in line