Regex 删除类似的行csh

Regex 删除类似的行csh,regex,duplicate-removal,csh,similarity,Regex,Duplicate Removal,Csh,Similarity,我看过几篇关于删除重复行的文章,但我需要一些更具体的东西。以下是一些原始数据的示例: 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

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

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与正则表达式匹配行的第一部分的示例。我的困惑是“BB64”和“BB###”的出现,不仅删除了所有BB行,还删除了第一行

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

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

以下是我到目前为止所得到的基本信息(在查看使用其他语言的示例时仍然存在语法问题,因此如果您可以更正,请执行以下操作):


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

似乎
sort-k4,4 | uniq
会起作用?(或者
sort+3
如果Solaris版本足够旧。)

+1对于第一个问题,格式良好,示例输入,所需输出和示例代码!。一个月一次的事件!但是,这是一个非常好的sed表达式:-)。如果您编辑您的问题,告诉我们您认为sed正在做什么,这将有所帮助。但同意以下观点,sort | uniq可能是更好的方法。祝大家好运,你觉得呢?我不能完全理解他想要什么,但考虑到输出结果,我会从grep date1开始。不幸的是,date1可以是今天的日期,从现在起2个月,甚至从现在起一年。我认为在我的情况下,对日期进行预测是不可行的。我想我最好的办法是做一个foreach行,把###作为计数器,删除每一行,但第一行直到###为零。输入已经排序,但我不认为uniq会起作用,因为我想删除的行不相同,因为在一系列BB中,每个行的日期都不同。此外,如果11111、22222等有多个系列的BB64行,那么我需要每个系列的date1行(因此我可能需要一些副本)。那么,您要删除的“副本”到底是什么?为什么“11111 BB 64 date1”在您的示例输出中出现两次?我们正在查看的是一个发生次数最多为64次的费用列表。因此,如果有人想要超过64个,他们必须订购两次。因此,您会看到11111 BB 64 date1两次,因为您在输入中有11111 BB 64 date1到date 64两次(我们只希望第一次出现)。我们并不是真的删除重复项,比如说,因为我们删除的每一行都因日期而略有不同。当然,当64个订单中有多个系列时,还需要重复行,这增加了复杂性。但是,如果您只想要第一次出现,为什么在显示您想要得到的东西时,要同时保留这两个行?
sed 'N;(\d{1,8}\sBB\s\d{1,2}.+\n);P;D' filename