2

我看过几篇关于删除重复行的文章,但我需要一些更具体的东西。以下是一些原始数据的示例:

11111 AA 1  date1
11111 BB 64 date1
11111 BB 64 date2
...
11111 BB 64 date64
11111 BB 64 date1
11111 BB 64 date2
...
11111 BB 64 date64
11111 BB ## date1
11111 BB ## date2
...
11111 BB ## date##
22222 AA 1  date1
22222 BB 64 date1
22222 BB 64 date2
...
22222 BB 64 date64
22222 BB 64 date1
22222 BB 64 date2
...
22222 BB 64 date64
22222 BB ## date1
22222 BB ## date2
...
22222 BB ## date##

注意:其中 ## 是一些 < 64 的数字。

我需要编辑该文件,使其看起来像这样:

11111 AA 1  date1
11111 BB 64 date1
11111 BB 64 date1
11111 BB ## date1
22222 AA 1  date1
22222 BB 64 date1
22222 BB 64 date1
22222 BB ## date1

我已经看到了几个使用 awk、sed 或 ed 以及正则表达式来匹配行的第一部分的示例。我的困惑在于“BB 64”和“BB ##”的出现,而不仅仅是删除所有 BB 行,而是删除第一行。

重要信息:在 Solaris v5.8 上运行此 csh 脚本

AA 线在这个问题中并不重要,除了知道它们在那里(我们没有对它们做任何事情)。

到目前为止,这基本上是我所得到的(在查看使用其他语言的示例时仍然存在语法问题,所以如果你能纠正,请做):

sed 'N;(\d{1,8}\sBB\s\d{1,2}.+\n);P;D' filename

如果我没有因为语法而出错,我相信这会删除所有 BB 行,但第一个“BB 64 date1”除外。我认为我上面的 sed 正则表达式基于 uniq 但只匹配行的第一个部分而不是整行,因为我需要每个 BB 的第一个日期(如果每个 11111、22222 有超过 1 个系列的 BB 64等,每个系列的输出应包含相同的 BB 64 行 [只是 date1])。有任何想法吗?

4

1 回答 1

1

似乎sort -k4,4 | uniq会做的伎俩?(或者sort +3如果 Solaris 版本足够旧。)

于 2012-09-20T22:17:24.207 回答