将循环“for”与语句“if”结合起来

将循环“for”与语句“if”结合起来

我为 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。当您浏览字段时,如果其中一个字段与 匹配ABCk则设置为1。因此,一旦处理完所有字段,如果k仍为0,则该行不包含任何内容ABC,并打印一条消息。在上面给出的示例文件上运行此脚本将打印:

No ABC in line 1
line

答案2

isFound尝试在循环前声明一个变量,名为for。在 之后print $(i-2),设置isFound为。用一个语句true替换当前语句,说明 if is false then print 。elseififisFoundno ABC in line

相关内容