0

2 つのファイルを比較する必要がある Unix スクリプトに取り組んでいます。1 つのファイルは ID のリスト (ids.txt で、もう 1 つは重複 ID のリスト (duplicate.txt) です。両方のファイルを比較し、ids.txt で見つかった各重複にカウント システムを追加する必要があります。既に作成しています。重複ファイルと ID ファイルを比較して、重複ファイルの末尾に数字を追加するだけです。

awk 'FILENAME=="duplicates.txt" {arr[$0]++}
 FILENAME=="ids.txt" {print $0, arr[$0]} ' duplicates.txt ids.txt

これはほとんど機能します。唯一の問題は、すべての複製の最後に 1 が追加されていることですが、複製ごとにカウントアップする必要があります。たとえば、ファイルに 3 回 dabbot がある場合、dabbott1 dabbott2 dabbott3 となる必要があります。前もって感謝します。

4

1 に答える 1

1

スクリプトを基礎として使用する:

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の代わりに書くことができます。dabbot1dabbot1printf $0, ++cnt[$0]ifprintf

このトリックを使用すると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) を認識し、それらの行に接尾辞を出力できます。

于 2012-12-14T04:18:32.440 に答える