
私は以前に質問したことがあります。重複フィールドを識別し、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
個別に渡していない場合は、次のことを試してください。
- まず、ソース入力ファイルがソートされていることを確認してください。
sort unsorted_file > file
- ジャンプした以前に見つけた 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
- 最後に
comm
重複を削除するには、出力をファイルに保存しますfile_3-6_uniques
。たとえば、次のようになります。
$ comm -23 file file_3-6_dupes > file_3-6_uniques
どのように動作しますか?
- ソートされた入力のみが正しく機能するため、ソートされた入力が
file
必要です。comm
- この
awk
コマンドは、見つかった重複項目が表示される順序を変更せずに元のファイルにあった順序に従うので、file
実際にはfile
元のファイルを最初にソートするだけです。 - デフォルトでは、
comm
3つの列(ファイル1の行のみ、ファイル2の行のみ、共通行)が出力されます。 - ファイル1:
file
- ファイル2:
file_3-6_dupes
-number
オプションはcomm
抑制する出力列を指定します。- つまり
-3
、comm
一般的な出力列 3 を抑えるという意味です。 file_3-6_dupes
これには派生した重複項目のみが含まれているため、これらの重複項目は次のように共通するfile
唯一のものです。file
file_3-6_dupes
- 私たちは反対を望んでいるので、共通
-3
のもの、つまり重複を抑制します。 - ファイル2のコンテンツのみを抑制するために追加のコンテンツは必要ありません
-2
。私たちの場合は何もありません。
awk
したがって、元のファイルとの組み合わせを使用して、列3から6のcomm
重複行を削除する目的を達成できます。
ヒント
- 元のバージョンが
file
Windowsバージョンの場合、Unix以外の行末が原因でcomm
awkビルドが正しく機能しない可能性がありますfile_3-6_dupes
。したがって、機能しない場合は実行し続け、手順を再試行すると機能しますdos2unix
。file
comm