此问题已在此处有答案:
How to delete duplicate lines in a file without sorting it in Unix(9个回答)
3天前关闭。
我正试图清除日志文件中的重复行。首先,我使用带有uniq -d标志的排序命令,它帮助我删除重复项,但没有解决我的问题。
sort pnum.log | uniq -d
sort命令的输出。
PNUM-1233: [App] [Tracker] Text
PNUM-1233: [App] [Tracker] Text
PNUM-1236: [App] [Tracker] Text ddfg
PNUM-1236: [App] [Tracker] Text ddfg
PNUM-1234: [App] [Tracker] Tex 123 ssd
PNUM-1235: [App] [Tracker] Text 1dbg
PNUM-1234: [App] [Tracker] Text 123 ssd vp
排序命令删除重复,但不幸的是,我还需要删除重复的PNUM行,并在示例输出中只保留一个唯一的长文本PNUM,它将是“PNUM-1234:[应用程序] [跟踪器]文本123 ssd vp”和其他2行PNUM-1234应从文件中删除。如何才能做到这一点?有没有像sort这样的linux命令可以帮助我排序?
期望值是:
PNUM-1233: [App] [Tracker] Text
PNUM-1236: [App] [Tracker] Text ddfg
PNUM-1235: [App] [Tracker] Text 1dbg
PNUM-1234: [App] [Tracker] Text 123 ssd vp
5条答案
按热度按时间c86crjj01#
sort | uniq -d
不会删除重复项,它会打印**重复的每一批行中的一行。您可能应该使用sort -u
来代替-that将删除重复项。但要回答你的问题
第一个
awk
命令只是在每一行前面加上它的长度,这样后续的sort
就可以对所有的行进行最长的排序,然后第二个awk
只在第一次出现关键字字段值时输出该行(现在是具有该关键字值的最长行),然后cut
删除第一个awk
添加的行长度。按顺序:
你没有说如果同一个键值的多行长度相同,那么打印哪一行,所以上面的代码只会随机输出其中一行。如果这是一个问题,那么您可以使用GNU排序并添加
-s
参数(对于stable sort
)或将命令行更改为awk '{print length($0), NR, $0}' file | sort -k1,1rn -k2,2n | awk '!seen[$3]++' | cut -d' ' -f3-
-在这两种情况下,这将确保在这种冲突中的行输出将是输入中出现的第一个。cnjp1d6j2#
假设您已经删除了重复的行,您可以使用下面的
awk
语句来只打印基于第一列PUM-XXXX
的唯一行,但选择最长的一列。因此,您必须创建一个数组
to_print
,以跟踪最大的行。最后,它会打印出这个数组。0yycz8jy3#
因为第一个字段似乎具有恒定的字符计数,所以您可以:
aor9mmx14#
这些命令应该能够从pnum.log文件中删除具有重复/重复PNUM的行,仅保留一个具有最长文本的唯一PNUM,并保持其相对行顺序:
jljoyd4f5#
您可以使用下面的代码,出于调试目的,您可以使用额外列出的代码。它可以帮助任何人搜索。