私も知っています
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
書き込みには固有の行のみを使用し、書き込みfile1
にfile2.new
は同じ行を使用しますが、ではfile2
。
このソリューションの唯一の欠点は、2つのx
メモリが必要であることです。ここで、x
最初のファイルの一意の行数はです。つまり、各固有ラインのコピーを2つ保存しますfile1
(配列のインデックスseen
とkeep
配列の値)。 。
答え2
これは2段階のプロセスです。
不要な行を削除するためにsedスクリプトを生成するawkスクリプト
awk 'seen[$0]++ {print NR "d"}' file1 > remove.sed
次に、sedスクリプトを使用して目的のファイルの行を削除します。
sed -i -f remove.sed file1 file2