Ansatzの備忘録

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

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

問題141 テーブル情報からのダミーデータ生成

問題のファイルは

https://github.com/shellgei/shellgei160

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

与えられた表を読み取ってダミーデータを作成しろと指示があったが、VARCHARなどを解釈するワンライナーを書けということなのかと思ってしまい全然できなかった。実際は全然そんな意図ではなかった。

解答例は

cat tableinfo.txt | awk '{print $1,$2}' | rs -T | tr -d 'VARCHAR()' | cat - <(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -b50 | head ) | awk 'NR==1;NR==2{for(i=1;i<=NF;i++)a[i]=$i;f=NF}NR>2{c=0;for(i=1;i<=f;i++){printf (a[i]=="INT" ? NR-2 : substr($1,c,a[i]))" ";c+=a[i]}print ""}' | sed 's/  */,/g' | sed -E '2,$s/.{10}$/@test.com/'

となる。cat はいくつかファイルを与えると順番に出力するというのは今回(多分)初めて知った。cat に与えているプロセス置換のtrは英数字以外を削除するという意味だ。-cで指定した集合の補集合を選ぶという意味になる。下から2行目のawkのINTはたぶん最初にa[i]の中身がINTという文字かどうかを確認している。つまりa[i]=="INT"が三項演算子の条件式になっている。ちょっとわかりにくかった。