awk で TSV の2列目が重複する行を削除し、元ファイルに上書きする

色々詰め込んだタイトル…。

次のような TSV があったとする。

001    Hoge
002    Fuga
003    Foo
004    Fuga
005    Bar
006    Piyo

掲載コードは半角スペース4つにしてあるが、実際はタブ文字で区切られている TSV ファイルである。

コレを見ると、002004 の行は、ともに2列目 (2カラム目) が Fuga で重複している。コレを判断し、重複している行を片方削除したい。

どうやら awk で重複行を削除できそうなので作ってみた。

$ awk -F "\t" '!colname[$2]++{print $1"\t"$2}' ./example.tsv

こんな風に、-F オプションで区切り文字をタブ文字に指定し、$2 で2列目をカウントする。重複行は 2 以上になるため print 部分には乗ってこない仕組みだ。$1"\t"$2 で、元と同じ2カラムの行を再現しているというワケ。

コレで重複行の削除はできるようになった。

さらに、GNU awk v4.1.0 以降では -i inplace というオプションが使えるようになっており、コレを使うと指定した元ファイルにそのまま上書き保存できるようになるのだ。sed -i 的なヤツである。

# タブ区切りのファイルの2列目が重複している行を削除し、元ファイルに上書きする
$ awk -i inplace -F "\t" '!colname[$2]++{print $1"\t"$2}' ./example.tsv

というワケでコレが完成形。よきよき。