awk で TSV の2列目が重複する行を削除し、元ファイルに上書きする
色々詰め込んだタイトル…。
次のような TSV があったとする。
001 Hoge
002 Fuga
003 Foo
004 Fuga
005 Bar
006 Piyo
掲載コードは半角スペース4つにしてあるが、実際はタブ文字で区切られている TSV ファイルである。
コレを見ると、002
と 004
の行は、ともに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
というワケでコレが完成形。よきよき。