我的文字如下:
[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
匹配的行的一部分?
答案 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)
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