【问题标题】:using awk to read alternate lines by condition [closed]使用 awk 按条件读取交替行 [关闭]
【发布时间】:2022-01-31 08:30:49
【问题描述】:

我希望使用 awk 执行以下任务:默认情况下,在第 1 列打印每个唯一项目的第一行。如果在第 2 列有 MATCH1 或 MATCH2,则打印该行。如果第 2 列同时存在 MATCH1 或 MATCH2,则只打印 MATCH1 的行,即 MATCH1 将是优先级。

A   1
A   2
A   3
A   MATCH1
A   5
A   6
B   1
B   MATCH2
B   3
B   MATCH1
B   5
C   1
C   MATCH2
C   3
C   4
D   1
D   2

预期结果:

A   MATCH1
B   MATCH1
C   MATCH2
D   1

怎么做?谢谢。

【问题讨论】:

  • 欢迎来到 SO,在 SO 上,强烈鼓励 OP 在他们的问题中以代码形式添加努力,所以请在您的问题中添加相同的内容(不是我的反对意见)。
  • 我认为 awk 对于粗心的人来说可能会很尴尬,要么你的代码是正确的,要么你的代码什么也没产生。无论如何,谢谢你的提示!

标签: unix awk


【解决方案1】:

此脚本生成您需要的输出:

{
   if (a[$1] == "") {
     a[$1] = $2;
   }
   if ($2 == "MATCH1") {
     a[$1] = $2;
   }
   if ($2 == "MATCH2" && a[$1] != "MATCH1") {
     a[$1] = $2;
   }
}


END {
   for (i in a) {
     print i " " a[i];
   }
}

【讨论】:

  • 对不起,脚本生成以下结果 A 1 B 1 C 1 D 1 其中上述代码作为 sample2.awk cat test.txt 放在 GNU nano 中 | awk -f sample2.awk
  • 我认为您在我仍在编辑时捕获了“正在进行的工作”版本。我在 Linux debian 和 Cygwin 安装上测试了最终脚本,它工作正常。能否请您复制最新版本并重试?
【解决方案2】:

另一个版本

awk '
    function r(arg) { gensub(/.*([0-9]+)$/, "\\1", "1", arg) }

    !a[$1] { a[$1] = $2 }

    $2 ~ /MATCH/{ 
        s=r(a[$1])
        m=r($2)
        if(s >= m || !a[$1]) {
            a[$1]=$2
        }
    }
    END {
        for(i in a) {
            print i, a[i]
        }
    }' log1

【讨论】:

    【解决方案3】:

    您可以使用这个awk 解决方案:

    awk '
    !($1 in a) || (a[$1] != "MATCH1" && $2 ~ /^MATCH[12]$/) {
       a[$1] = $2
    }
    END {
       for (i in a)
          print i, a[i]
    }' file
    
    A MATCH1
    B MATCH1
    C MATCH2
    D 1
    

    【讨论】:

      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 2022-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多