awk 搜索帮助

awk 搜索帮助

我需要一个简单的 awk 脚本的帮助来匹配行上的字母。

例如,在一个字段中为 KJ 查找单独的匹配项,并在下一个字段中为 KP 查找匹配项?

Name       VT       Kip     Rand
NINA        K        K       kevdhekdmabr2738
NINA        J        P       pdbkemgwjsabeb483
NINA        A        J       meveahsbkdemjep48328
NINA        P        K       ehkmskdldadvsvpm46383
NINA        M        P       zbdamshasjerrj3738   
NINA        J        K       amfjekspdbejd34549
NINA        P        M       pokjdokdam2452355235

如您所见,所有 Rand 列都有一系列与我需要的字母相匹配的字母。如果尝试过awk '/nina/ && /K/ && /J/ && /K/ && /P/ {print $0}' sampfile.txt

有没有办法可以做到这一点而不参考特定的列/字段?

答案1

我不知道你对命名列有什么意见。如果你想指定其中的内容,你需要具体地调用它们。

awk 'NR>1 && $2~/^[KJ]$/ && $3~/^[KP]$/ {print $1}' ...

这将匹配K-KK-PJ-KJ-P打印名称列。它还将跳过看起来像标题的第一行。

它与示例中的以下几行相匹配:

NINA        K        K       kevdhekdmabr2738
NINA        J        P       pdbkemgwjsabeb483
NINA        J        K       amfjekspdbejd34549

但显然只打印NINA

答案2

据我了解,您想要显示符合此条件的行:

每行任意一列包含两个“K”标记,且下一行包含:第一个“K”同一列中的“J”标记和第二个“K”同一列中的“P”标记

这个程序可以满足你的需要

     BEGIN { nlines = 0; }              
     {   
       lines[nlines] = $0;   
       kfound[nlines] = "";   
       jfound[nlines] = "";   
       pfound[nlines] = "";   
       for (i=1;i<=NF;i++) {
          if ($(i) == "K") kfound[nlines] = kfound[nlines] " " i;
          if ($(i) == "J") jfound[nlines] = i;
          if ($(i) == "P") pfound[nlines] = i;   
       }   
       nlines++; 
     } 
     END {   
        for(i=0;i<nlines;i++) {
           ntok = split(kfound[i],tok," ");
           if (ntok < 2) continue;
           if (tok[1] == jfound[i+1] && tok[2] == pfound[i+1]) {
              print lines[i];
              print lines[i+1];
           }   
        } 
     }

保存在文件 test.awk 中并尝试:

awk -f test.awk fileWithInputLine.txt

相关内容