Linux删除文件内重复行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux删除文件内重复行相关的知识,希望对你有一定的参考价值。
参考技术A 第一,用sort+uniq,注意,单纯uniq是不行的。第二,用sort+awk命令,注意,单纯awk同样不行,原因同上。
第三,用sort+sed命令,同样需要sort命令先排序。
以上原理都是上下行比对,如果中间开了几行,uniq就不生效
例如:
111
222
111
是不能正确排序的,必须是:
111
111
222
uniq才会生效,所以都需要先用sort 来排序,然后将结果输出到其他文件。
逐行删除文本文件中的重复项
【中文标题】逐行删除文本文件中的重复项【英文标题】:Remove duplicates in text file line by line 【发布时间】:2017-03-08 23:36:10 【问题描述】:我正在尝试编写一个 Python 脚本来删除文本文件中的重复字符串。但是,重复数据删除应该只发生在每一行内。
例如,文本文件可能包含:
þ;ABC.001.123.1234;þ;;þ;10 ABC\ABCD\ABCDE;10 ABC\ABCD\ABCDE;þ þ;ABC.001.123.1234;þ;;þ;10 ABC\ABCD\ABCDE;12 EFG\EFG;12 EFG\EFG;þ þ;ABC.001.123.1234;þ;;þ;10 ABC\ABCD\ABCDE;12 EFG\EFG;09 XYZ\XYZ\XYZ;12 EFG\EFG;þ
因此,在上面的示例中,脚本应该只删除粗体字符串。
我搜索了 Stack Overflow 和其他地方以尝试找到解决方案,但运气不佳。似乎有许多解决方案可以删除重复的行,但我正在尝试逐行删除一行中的重复项。
更新:澄清一下 - þ
是每个字段的分隔符,;
是每个字段中每个项目的分隔符。在每一行中,我试图删除分号之间包含的任何重复字符串。
更新 2: 示例已编辑以反映重复值可能并不总是紧跟在值的第一个实例之后。
【问题讨论】:
使用带有反向引用的正则表达式来检测一个字符串,后跟一个自身的副本。 您的字段是否用分号分隔; ?因为 ABC 和 123 重复了很多次。 如果字段是用分号隔开,那么þ
字符应该如何处理呢?是否可以在行中任何地方出现重复,或者您只对连续重复感兴趣?另外:匹配是否区分大小写,空格是否重要?
@ekhumoro þ
分隔每个字段,;
分隔字段下的每个项目。因此,基本上,逐行删除分号之间的重复字符串。
你仍然需要回答空格是否重要:10 ABC\ABCD\ABCDE; 10 ABC\ABCD\ABCDE 不是重复的,因为空格使它们不同。
【参考方案1】:
@Prune 的回答给出了这个想法,但需要像这样修改:
input_file = """"þ;ABC.001.123.1234;þ;;þ;10 ABC\ABCD\ABCDE;10 ABC\ABCD\ABCDE;þ
þ;ABC.001.123.1234;þ;;þ;10 ABC\ABCD\ABCDE;12 EFG\EFG;12 EFG\EFG;þ"""""
input = input_file.split("\n")
for line in input:
seen_item = []
for item in line.split(";"):
if item not in seen_item or item == "þ":
seen_item.append(item)
print(";".join(seen_item))
【讨论】:
【参考方案2】:import re
with open('file', 'r') as f:
file = f.readlines()
for line in file:
print(re.sub(r'([^;]+;)(\1)', r'\1', line))
逐行读取文件;然后使用 re.sub 替换重复项。
【讨论】:
谢谢。这真是一个很棒的解决方案。我现在唯一的问题是删除重复值的第一个实例后不一定立即出现的重复项。例如:;þ;MEP.0002.087836;þ;;þ;15 Engineering\03 Personal Folders\ENGBIBLES\Cranes\Liebherr\LT1220;15 Engineering\03 Personal Folders\ENGBIBLES\Cranes\Liebherr\LG1300;15 Engineering\03 Personal Folders\ENGBIBLES\Cranes\Liebherr\LT1220;15 Engineering\03 Personal Folders\ENGBIBLES\Cranes\Liebherr\LG1300;
以上是关于Linux删除文件内重复行的主要内容,如果未能解决你的问题,请参考以下文章