Ansatzの備忘録

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

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

問題96 日程調整

問題のファイルは

https://github.com/shellgei/shellgei160

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

ファイル名が人名になっていて、ファイル内には書かれた飲み会に参加可能な日付が書いてある。これを踏まえて3人以上参加可能な日を探し出す問題だった。joinで前に似たようなことをしたなと思ったがどうやればいいか思い出せなかった。解答では違うやり方をしている。

解答例は

$ awk '{print $0,FILENAME}' user* | sort | awk 'pre!=$1{print "";printf $0}pre==$1{printf " "$2}{pre=$1}' | awk 'NF>3'

となる。まずファイル名をファイルに追加して日付でソートする。そのあとawkで同じ日付の横にファイル名を追加していく。この処理では先頭に空行ができるが、その理由は最初に処理を行うとき変数preが空であることからpre!=$1が成立してこの処理が行われるためである。すなわちprintで空文字を出力した後改行してprintfで行全体を出力する。次の入力行の処理結果は前行のprintfで出力した行と同じ行から出力が始まる。あとはNFを用いて3人以上いる日付を選ぶだけである。