查找两个连续重复的行

查找两个连续重复的行

如何在文件中找到两个串联的重复行?

例如,在此文件中,我们只有两个串联的重复行:

 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

相关内容