.." />

道具としてのコンピュータ

2014年1月28日
だらだら書かれたテキストファイルをShellでCSVに整形する


原稿整理もShellでだいぶスピードアップが図れているこのごろ。
1つのファイルにまとまっていたデータの整形を工夫して加工したメモです。

[xxx@xxxx]$ cat mondai
Q1.徳川幕府の初代将軍はだれか?

①      徳川家康
②      徳川家光
③      徳川秀忠

答え ①

Q2.「源氏物語」の作者はだれか?
①      清少納言
②      紫式部
③      藤原道綱母

答え ②

というmondaiファイルがあります。
これを1問1行で、カンマ区切りのファイルにする必要に迫られました。
問題は200問あります…。さすがに手作業は厳しい。
1コマずつセルに張り付けている間に、絶対眠くなる…。

そこで今回はShellでごにょごにょと加工してみることにしました。


まず無駄なタブや改行、空白をsedで取り除きます。

[xxxx@xxxx]$ sed '/^$/d' mondai | sed -e 's/t//g' | sed 's/ //g' > mondai2
Q1.徳川幕府の初代将軍はだれか?
①徳川家康
②徳川家光
③徳川秀忠
答え①
Q2.「源氏物語」の作者はだれか?
①清少納言
②紫式部
③藤原道綱母
答え②

このあとファイルを「Q[0-1]で始まる行」ごとに分割します。
ファイル分割はcsplitというコマンドでできます。とても便利!

[xxx@xxxx]$ csplit -z -f mondai- -n 4 mondai2 /^Q[0-9]/ {*}
104
104
<略>
[xxx@xxxx]$ ls
mondai  mondai-0000  mondai-0001 mondai-0002 mondai-0003
mondai-0004 mondai-0005 mondai-0006
<略>
[xxx@xxxx]$ cat mondai-0001
Q2.「源氏物語」の作者はだれか?
①清少納言
②紫式部
③藤原道綱母
答え②

※参考
テキストファイルを任意の文字列で分割するには
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/a072csplit.html

ここからawkの力技?でカンマ区切りにしてしまいましょう。

[xxx@xxxx]$ for file in `ls mondai-*`; do tateyoko $file | awk '{print $1","$2","$3","$4","$5}' >> result.csv  ;done
[xxx@xxxx]$ cat result.csv
Q1.徳川幕府の初代将軍はだれか?,①徳川家康,②徳川家光,③徳川秀忠,答え①
Q2.「源氏物語」の作者はだれか?,①清少納言,②紫式部,③藤原道綱母,答え②

ということで、無事CSVに書きだすことができました。
原稿整理にもShellは便利。
さらに精進して早期入稿を目指す所存にございます。

Related Posts