【问题标题】:How can I use awk to print a line only if its right half of line _doesn't_ match the previous line's right half?仅当行的右半部分_不_与前一行的右半部分匹配时,如何使用 awk 打印一行?
【发布时间】:2010-10-30 19:24:16
【问题描述】:

我有这样的文字:

[100 ps] 酒吧 [139 ps] 富德发发 [145 ps] 发发发发 [147 ps] 发发发发 [149 ps] le pamplemouse [150 ps] le pamplemouse [177 ps] le pomme de terre [178 ps] le pomme de terre

在 awk 中,我想过滤掉右半部分与前一行右半部分匹配的所有行。即 uniquify 行,好像没有时间戳一样。所以我会拒绝:

[100 ps] 酒吧 [139 ps] 富德发发 [145 ps] foo de fa fa

给我一​​个输出:

 [100 ps] 小节
    [139 ps] 富德发发
    [149 ps] le pamplemouse
    [177 ps] le pomme de terre

如何做到这一点?

编辑: 对不起,我没有像我应该说的那么清楚。字符串的左半部分是带有固定数量标记的时间戳,但右半部分将有许多标记。一般来说,我可以创建任意内存分组,例如:

(regex1)(regex2)

然后比较$2,其中$2是匹配regex2的那行部分?

【问题讨论】:

    标签: awk


    【解决方案1】:

    Running on ideone:

     BEGIN {prev=""}
    
     $3==prev {next}
    
    { prev = $3;
     print;}
    

    【讨论】:

    • 你能概括一下这个解决方案,其中字符串的左半边和右半边是由正则表达式定义的吗?
    • @Ross 您能否将其添加到您的问题中并提供一个示例?
    • 我得到了我想要操作字段分隔符的内容,因为字符串的中间部分是恒定的:BEGIN { FS = "ps L fc";...
    • @Ross 太好了! /还有一个字符要走
    【解决方案2】:

    您可以使用associative arrays 为右侧的每个键维护一个计数器。

    这是一个概念的证明,您可以将其用作起点

    $ echo "[100 ps] bar\n[139 ps] foo\n[140 ps] foo" |
      awk '{count[$3]++; if (count[$3] == 1) print;}'
    [100 ps] bar
    [139 ps] foo
    

    如果右侧字符串可以包含空格,则必须对其进行调整。

    【讨论】:

      【解决方案3】:

      什么将右半部分与左半部分分开?它是一个制表符还是多个空格?如果是标签,那么:

      awk -F '\t' '
          $2 in seen {next} 
          { print; seen[$2]=1 }
      '
      

      否则,我会写类似的东西

      perl -ane '
          $right_half = join " ", @F[2..-1];
          if (not $seen{$right_half}) {
              print;
              $seen{$right_half} = 1;
          }
      '
      

      【讨论】:

        【解决方案4】:
        $ awk -F"][ \t]+" '!a[$2]++' file
        [100 ps]  bar
        [139 ps]  foo de fa fa
        [149 ps]  le pamplemouse
        [177 ps]  le pomme de terre
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-19
          • 1970-01-01
          • 2017-02-08
          • 1970-01-01
          相关资源
          最近更新 更多