背景・目的
- CSVファイルの特定のフィールドの組み合わせが重複していないか確認する必要があった
- 先頭フィールドに行番号が振られていたので単純な
sort | uniq
ができなかった - 確認用にわざわざファイルを作成したりしたくなかった
- ワンライナーでパッと確認したかった
コマンド
# 特定フィールドの組み合わせが重複している行を出力
$ awk -F',' 'a[$2","$4]++ { print }' example.csv
ミニ解説
-
-F','
で区切り文字をカンマに指定 -
a[$2","$4]++
で特定のフィールドをキーに、出現回数を値にした配列を作成している - 上記の配列を判定して2回以降出現した組み合わせは後続の処理を実行する
- awkの判定は
0:偽
、0以外:偽
となる - ここではインクリメント前の値が判定されてからインクリメントされるので、初めて出現した組み合わせの数は
0
なので後続のprint
が実行されず、インクリメントされる - 2回以降出現した組み合わせは最初から
1
以上、つまり真になるので後続のprint
が実行される
補足
- awkの判定では数値として認識できない場合(空文字など)も偽となるので注意
- CSVだけでなくTSVやその他にも特定の区切り文字でフィールドの順序が合わせられるファイルであれば同じように対応可能だと思われる