代码之家  ›  专栏  ›  技术社区  ›  Ross Rogers

如果一行的右半部分与前一行的右半部分不匹配,我如何使用awk打印该行?

awk
  •  2
  • Ross Rogers  · 技术社区  · 14 年前

    [100 ps]  bar
    [139 ps]  foo de fa fa
    [145 ps]  foo de fa fa
    [147 ps]  foo de fa fa
    [149 ps]  le pamplemouse
    [150 ps]  le pamplemouse
    [177 ps]  le pomme de terre
    [178 ps]  le pomme de terre
    

    在awk中,我想过滤掉所有的行,其中右半行匹配上一行的右半部分。i、 把那些不规则的线条当作没有时间戳。所以我拒绝:

        [100 ps]  bar
        [139 ps]  foo de fa fa
        [145 ps]  foo de fa fa  <-- Nuked
        [147 ps]  foo de fa fa  <-- Nuked
        [149 ps]  le pamplemouse
        [150 ps]  le pamplemouse <-- Nuked
        [177 ps]  le pomme de terre 
        [178 ps]  le pomme de terre <-- Nuked
    
    

    给我一个输出:

        [100 ps]  bar
        [139 ps]  foo de fa fa
        [149 ps]  le pamplemouse
        [177 ps]  le pomme de terre

    编辑: 对不起,我没说清楚。字符串的左半部分是一个时间戳,具有固定数量的令牌,但右半部分将具有许多令牌。通常,我可以创建任意的内存分组,如:

    (regex1)(regex2)
    

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

    4 回复  |  直到 14 年前
        1
  •  1
  •   Dr. belisarius    14 年前

    Running on ideone:

     BEGIN {prev=""}
    
     $3==prev {next}
    
    { prev = $3;
     print;}
    
        2
  •  1
  •   Adam Byrtek    14 年前

    你可以用 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
  •  1
  •   glenn jackman    14 年前

    是什么把右半部分和左半部分分开的?是一个标签还是多个空格?如果是标签,那么:

    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
  •  1
  •   ghostdog74    14 年前
    $ 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