如何在文件中找到两个串联的重复行?
例如,在此文件中,我们只有两个串联的重复行:
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.ear
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter <--
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter <--
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.xml
答案1
Uniq 应该足够了:
$ cat c.txt
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.ear
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.xml
$ uniq -D c.txt
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
$ uniq c.txt
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.ear
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.xml
默认情况下,uniq 检查输入文件的相邻行。因此,对于未排序的文件(如您的情况),uniq 将完成您想要的工作。
您可能还对 uniq -d 和 -u 选项感兴趣。有关更多详细信息,请参阅手册页(-d 仅打印两个重复行之一,-u 仅打印 uniq 行 - 删除两个重复条目)。
答案2
另外一个选择:
grep -zPo '\n(.+)\n\1\n'
这样我们可以添加额外的调整(例如接受额外的空格等)
升级:正如@thor 指出的那样,这并没有捕获文件开头的重复内容。为了解决这种情况,请使用
grep -zPo '(?<!.)(.+\n)\1'
答案3
AWK 的另一个选择:
awk 'x !~ $0; {x=$0}'
这样您可以获得与 uniq 相同的行为,但也可以按列执行。
awk -F/ 'x !~ $2; {x=$2}'
-F
设置字段分隔符。
通过这种方式,您可以删除第二个字段连续等于前一行的第二个字段的行。
$ cat c.txt
line/one
line/two
otherline/two
yetanotherline/two
line/three
$ awk -F/ 'x !~ $2; {x=$2}' c.txt
line/one
line/two
line/three