Subscribed unsubscribe Subscribe Subscribe

言語処理100本ノック2015 第2章: UNIXコマンドの基礎

はてブで50問解いた記事*1が話題になっていて、元の問題を眺めていた。第2章: UNIXコマンドの基礎ってのがあって、この章は自分でプログラムを書くのだけれど、答え合わせも兼ねてUNIXコマンドで実行しろと書いてある。ふと、はてUNIXコマンドですらすら回答できるかなとおもってUNIXコマンドでやってみた。

結果は、すらすら回答できるものもあったが、man, --helpを駆使して何とか解けるかといった感じのものもあった。

せっかくやったので、一応結果書いておく。

10. 行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ.

$ wc -l data/hightemp.txt

11. タブをスペースに置換

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

$ expand -t 1 data/hightemp.txt
$ cat data/hightemp.txt | tr "\t" " "
$ sed -e "s/\t/ /g" data/hightemp.txt

12. 1列目をcol1.txtに,2列目をcol2.txtに保存

各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.

$ cut -f 1 data/hightemp.txt > col1.txt
$ cut -f 2 data/hightemp.txt > col2.txt

13. col1.txtとcol2.txtをマージ

12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.

>|sh|
$ paste col1.txt col2.txt
|

14. 先頭からN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.

$ head -n 10 data/hightemp.txt

15. 末尾のN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.

$ tail -n 10 data/hightemp.txt

16. ファイルをN分割する

自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

$ split --number=l/3 data/hightemp.txt

このオプションは知らなかった。

17. 1列目の文字列の異なり

1列目の文字列の種類(異なる文字列の集合)を求めよ.確認にはsort, uniqコマンドを用いよ.

$ cut -f 1 data/hightemp.txt | sort | uniq
$ cut -f 1 data/hightemp.txt | sort -u

18. 各行を3コラム目の数値の降順にソート

各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).

$ sort -k 3r,3 data/hightemp.txt

19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる

各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.

$ cut -f 1 data/hightemp.txt | sort | uniq -c | sort -r