テキストファイルから重複行を削除し、削除された行数を取得する方法は?

テキストファイルから重複行を削除し、削除された行数を取得する方法は?

私も知っています

awk '!seen[$0]++' filename > output.txt

すべての重複エントリはテキストファイルから削除できます。しかし、この情報を使用して、他のファイルから同じ行を削除できるように、削除された行のリストをどのように取得できますか?

これは、1つの言語で書かれた大きなテキストファイルからすべての重複を削除し、翻訳された一致を失うことなく、その言語に翻訳されたファイルから同じ行を削除したいので、これが必要です。

より明確に説明するには:(文書1)

line A
line B
line A
line C
...

(文書2):

line 1
line 2
line 3
line 4
...

ファイル1から「ラインA」を削除し、ファイル2から「ライン3」を削除します。翻訳が必要:

line A -> line 1
line B -> line 2
line C -> line 4
... 

ファイル1B(重複排除)は次のとおりです。

line A
line B
line C
...

ファイル2B(重複排除)は次のとおりです。

line 1
line 2
line 4
... 

答え1

$ awk 'FNR==NR && !seen[$0]++ { keep[FNR]=$0; next } (FNR in keep) { printf("%s -> %s\n", keep[FNR], $0) }' file1 file2
line A -> line 1
line B -> line 2
line C -> line 4

このプログラムは問題の途中から出力を再現しますawk

プログラムは最初のファイル(file1)を読み取り、最初のブロックで重複した行を見つけます。このブロックはまた、keep行番号で索引付けされ、配列に保持される行を保持します。

2番目のファイル(コードの2番目のブロック)を読み取るときに行番号が保持したい番号の場合は、2番目のファイルの行と一緒に最初のファイルに保存されている行を出力します。

2つの新しいファイルバリアントを保存します。

awk 'FNR==NR && !seen[$0]++ { keep[FNR]=$0; print >FILENAME ".new"; next } (FNR in keep) { print >FILENAME ".new" }' file1 file2

file1.new書き込みには固有の行のみを使用し、書き込みfile1file2.newは同じ行を使用しますが、ではfile2

このソリューションの唯一の欠点は、2つのxメモリが必要であることです。ここで、x最初のファイルの一意の行数はです。つまり、各固有ラインのコピーを2つ保存しますfile1(配列のインデックスseenkeep配列の値)。 。

答え2

これは2段階のプロセスです。

  1. 不要な行を削除するためにsedスクリプトを生成するawkスクリプト

    awk 'seen[$0]++ {print NR "d"}' file1 > remove.sed 
    
  2. 次に、sedスクリプトを使用して目的のファイルの行を削除します。

    sed -i -f remove.sed file1 file2
    

関連情報