awkを使用して重複フィールドを識別して削除します。

awkを使用して重複フィールドを識別して削除します。

私は以前に質問したことがあります。重複フィールドを識別し、awkを使用して印刷します。

複数の列を含むファイルがあり、特定の列値(列3-6)が繰り返される行を識別したいと思います。

これに対する答えはawk 'n=x[$3,$4,$5,$6]{print n"\n"$0;} {x[$3,$4,$5,$6]=$0;}' file

今私が経験している問題は、データファイルから上記のコードで識別されたすべての行を削除し、繰り返されない行だけを残したいということです。

!=代わりに試しました=が、=と同じ結果を取得するか、ゼロ行を返します。私も試しましたが、 awk '!seen[$3, $4, $5, $6]++' file削除したい重複エントリの最初のインスタンスも保持します。

ベストアンサー1

解決策を探していますが、意図しawkた結果が重複を排除し、必ずしもawk個別に渡していない場合は、次のことを試してください。

  1. まず、ソース入力ファイルがソートされていることを確認してください。sort unsorted_file > file
  2. ジャンプした以前に見つけた awk コマンド列3から6の重複項目を識別し、出力をファイル(file_3-6_dupesコマンドプロンプトなど)に保存するために使用されます。
$ awk 'n=x[$3,$4,$5,$6]{print n"\n"$0;} {x[$3,$4,$5,$6]=$0;}' file > file_3-6_dupes
  1. 最後にcomm重複を削除するには、出力をファイルに保存しますfile_3-6_uniques。たとえば、次のようになります。
$ comm -23 file file_3-6_dupes > file_3-6_uniques

どのように動作しますか?

  • ソートされた入力のみが正しく機能するため、ソートされた入力がfile必要です。comm
  • このawkコマンドは、見つかった重複項目が表示される順序を変更せずに元のファイルにあった順序に従うので、file実際にはfile元のファイルを最初にソートするだけです。
  • デフォルトでは、comm3つの列(ファイル1の行のみ、ファイル2の行のみ、共通行)が出力されます。
  • ファイル1:file
  • ファイル2:file_3-6_dupes
  • -numberオプションはcomm抑制する出力列を指定します。
  • つまり-3comm一般的な出力列 3 を抑えるという意味です。
  • file_3-6_dupesこれには派生した重複項目のみが含まれているため、これらの重複項目は次のように共通するfile唯一のものです。filefile_3-6_dupes
  • 私たちは反対を望んでいるので、共通-3のもの、つまり重複を抑制します。
  • ファイル2のコンテンツのみを抑制するために追加のコンテンツは必要ありません-2。私たちの場合は何もありません。

awkしたがって、元のファイルとの組み合わせを使用して、列3から6のcomm重複行を削除する目的を達成できます。

ヒント

  • 元のバージョンがfileWindowsバージョンの場合、Unix以外の行末が原因でcommawkビルドが正しく機能しない可能性がありますfile_3-6_dupes。したがって、機能しない場合は実行し続け、手順を再試行すると機能しますdos2unixfilecomm

おすすめ記事