删除列表中80%的同一行

时间:2019-07-03 18:08:39

标签: linux sorting awk seed uniq

我有一个2 GB的文本文件,包含多个网址。

我想唯一显示此列表。我该怎么办?

我有一个类似

的列表
http://search.test.com:80/results.aspx?c=us&l=en&s=dhs&cat=abt%7ccss&cs=19&k=upgrades&img=True&sum=True&qmp=25&qo=0&eh=3&rrr=False
http://search.test.com:80/results.aspx?c=us&l=en&s=dhs&cat=abt%7ccss&cs=19&k=upgrades&img=True&sum=True&qmp=25&qo=0&eh=NoEvent&rrr=False
http://search.test.com:80/results.aspx?c=us&l=en&s=dhs&cat=abt%7ccss&cs=19&k=upgrades&img=True&sum=false&qmp=50&qo=0&eh=2&rrr=False
http://search.test.com:80/results.aspx?c=us&l=en&s=dhs&cat=abt%7cprr&cs=19&k=Buffalo&img=True&sum=false&qmp=10&qo=0&eh=2&rrr=False&subcat=&snpsb=K&snpsd=A
http://search.test.com:80/results.aspx?c=us&l=en&s=dhs&cat=abt%7cprr&cs=19&k=CD+burners&img=False&sum=false&qmp=25&qo=0&eh=2

如果行匹配80%相同,我想唯一显示此列表。

1 个答案:

答案 0 :(得分:0)

戴上我的阅读器帽子,“ 80%”是该行的前缀,其长度为行长的80%:

awk '
    {len80 = int(length($0) * 0.8); key = substr($0, 1, len80); uniq[key] = $0} 
    END {for (key in uniq) print uniq[key]}
' urlfile

对于您的示例输入,输出中包括每一行。

这将需要大量的内存来存储您2GB的大部分输入。