連続して繰り返される2行を探す

連続して繰り返される2行を探す

ファイル内の2つのリンクされた重複行を見つけるには?

たとえば、このファイルには2つのリンクされた繰り返し行しかありません。

 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は2つの重複行のうち1つのみを印刷し、-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フィールド区切り文字を設定します。

これにより、2番目のフィールドが前の行の2番目のフィールドと連続して同じ行を削除できます。

$ 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

関連情報