特定の列値が複数回表示される場合、行を削除する

特定の列値が複数回表示される場合、行を削除する

awkを介して多数の.tsvファイルを処理していますが、列2で重複しているか、または同じ値が観測されているすべての行を削除する必要があります。

例えば

a b c
value1 2 3
value2 2 5
value3 1 9
value4 1 0
value5 4 0
value6 1 0

しなければならない

a b c
value5 4 0

使用を検討しましたが、sort -k2 filename | awk 'count[$2]++ > 1'奇妙な結果が出ました。

$ sort -k2 file.txt | awk 'count[$2]++ > 1' | wc
    162    4212   33348
$ sort -k2 file.txt | awk 'count[$2]++ == 1' | wc
   3954  102804  704176
$ wc file.txt
  1029257  26760682 176254913

...合計は1029257でなければならないので意味がありません。私は何が間違っていましたか?

ベストアンサー1

awk$2ファイルを1行ずつ繰り返すので、現在の行のフィールドがファイル内で一意であるかどうかはわかりません。

ファイルを2回開く必要があります。 1つ目は計算用で、2つ目は印刷用ですcount[$2] == 1

awk '
    NR==FNR && FNR>1 {count[$2]++};
    NR>FNR && (FNR==1 || count[$2] == 1)
' file.txt file.txt
  • NR==FNRFNR>1ヘッダーを計算したくないので、最初のファイルでのみtrueになるように追加しました。
  • NR>FNRこれは2番目のファイルにも当てはまります。
    • ヘッダー(FNR==1)またはの場合はcount[$2]印刷します1

おすすめ記事