只有当行的右半部分与上一行的右半部分匹配时,如何才能使用awk打印一行?

时间:2010-10-29 23:25:58

标签: awk

我的文字如下:

[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中我想过滤掉行的右半部分与前一行的右半部分匹配的所有行。即,无条件的线条,好像没有时间戳。所以我说:

    [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,其中$2是与regex2匹配的行的一部分?

4 个答案:

答案 0 :(得分:1)

您可以使用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

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

答案 1 :(得分:1)

Running on ideone:

 BEGIN {prev=""}

 $3==prev {next}

{ prev = $3;
 print;}

答案 2 :(得分:1)

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

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;
    }
'

答案 3 :(得分:1)

$ 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