スクリプトを基礎として使用する:
awk 'FILENAME=="duplicates.txt" {arr[$0]++}
FILENAME=="ids.txt" { if (arr[$0]) printf "%s%d\n", $0, ++cnt[$0];
else print
}' \
duplicates.txt ids.txt
どの行が重複しているかがわかるように、到着した重複をカウント/記録します。重複ファイルに重複した名前が 1 回または何度もリストされているかどうかは、あまり重要ではありません。どちらでもOKです。
2 番目のループは、現在の行が重複リストにあるかどうかを示します。その場合は、その行に続いて事前にインクリメントされたカウンターを出力します (そのため、指定された複製の最初の出現は接尾辞として 1 で出力されます)。それ以外の場合、行は変更されずに出力されます。
FILENAME = "filename"
vsのメリットについて議論してFNR == NR
、2 つのファイルを区別することができます。最終的な結果は同じなので、次を試すこともできます。
awk 'FNR == NR { arr[$0]++; next }
{ if (arr[$0]) printf "%s%d\n", $0, ++cnt[$0];
else print }' duplicates.txt ids.txt
との間にスペースを入れないprint
場合は使用できませんのでご注意ください。スペースが問題ではなく、常に接尾辞 (重複がない場合は 0) が必要な場合は、 withの代わりに書くことができます。dabbot1
dabbot
1
printf $0, ++cnt[$0]
if
printf
このトリックを使用するとFNR == NR
、複製ファイルを事前に準備する必要さえありません。あなたは単に使用することができます:
awk 'FNR == NR { arr[$0]++; next }
{ if (arr[$0] > 1) printf "%s%d\n", $0, ++cnt[$0];
else print }' ids.txt ids.txt
ファイルを最初に処理するときに、重複しているレコードをカウントして分類します。ファイルの 2 回目の処理で、どれが重複しているか ( のカウントarr
が より多い1
) を認識し、それらの行に接尾辞を出力できます。