Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題98

問題98 レコードの振り分け

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

2つあるファイルの片方にしかない言葉と両方に載っている言葉を仕分ける問題だった。grepでも使うのかと思って悩んだがcommという、この問題のために作られたようなコマンドがあるらしい。

解答例は

comm <(sort list1) <(sort list2) | awk -F'\t' '{print $NF > (NF==3?"common":"oneside")}'

となる。commは二つのファイルから片方にしかない行と両方に存在する行をそれぞれわけて出力するコマンドだ。1列目に1つ目のファイルにのみ存在する行を、2列目には2つ目のファイルにのみ存在する行、3列目に共通の行を出力する。$NFはその行の最後のフィールドを表す変数だ。最後の3項演算子ではフィールドの個数が3になったときとそれ以外でファイル名を変えている。awkでのリダイレクトはファイルへの追記でも>>としなくていいらしい。