はじめに
言語処理100本ノックというNLPに関する問題集が東京工業大学によって作成、管理されています。
この記事では、「第2章: UNIXコマンド」について回答例を紹介します。
環境設定
popular-names.txt は,アメリカで生まれた赤ちゃんの「名前」「性別」「人数」「年」をタブ区切り形式で格納したファイルである.以下の処理を行うプログラムを作成し,popular-names.txt を入力ファイルとして実行せよ.さらに,同様の処理を UNIX コマンドでも実行し,プログラムの実行結果を確認せよ.
$ wget https://nlp100.github.io/data/popular-names.txt
10. 行数のカウント
行数をカウントせよ.確認には wc コマンドを用いよ
$ wc -l popular-names.txt
2780 popular-names.txt
11. タブをスペースに置換
タブ 1 文字につきスペース 1 文字に置換せよ.確認には sed コマンド,tr コマンド,もしくは expand コマンドを用いよ.
$ head -5 popular-names.txt
Mary F 7065 1880
Anna F 2604 1880
Emma F 2003 1880
Elizabeth F 1939 1880
Minnie F 1746 1880
$ sed -e 's/\t/ /g' popular-names.txt | head -n 5
Mary F 7065 1880
Anna F 2604 1880
Emma F 2003 1880
Elizabeth F 1939 1880
Minnie F 1746 1880
12. 1 列目を col1.txt に,2 列目を col2.txt に保存
各行の 1 列目だけを抜き出したものを col1.txt に,2 列目だけを抜き出したものを col2.txt としてファイルに保存せよ.確認には cut コマンドを用いよ.
$ cut -f 1 popular-names.txt > col1.txt
$ cut -f 2 popular-names.txt > col2.txt
13. col1.txt と col2.txt をマージ
12 で作った col1.txt と col2.txt を結合し,元のファイルの 1 列目と 2 列目をタブ区切りで並べたテキストファイルを作成せよ.確認には paste コマンドを用いよ.
$ paste col1.txt col2.txt | head -n 5
Mary F
Anna F
Emma F
Elizabeth F
Minnie F
14. 先頭から N 行を出力
自然数 N をコマンドライン引数などの手段で受け取り,入力のうち先頭の N 行だけを表示せよ.確認には head コマンドを用いよ.
$ head -n 5 popular-names.txt
Mary F 7065 1880
Anna F 2604 1880
Emma F 2003 1880
Elizabeth F 1939 1880
Minnie F 1746 1880
15. 末尾の N 行を出力
自然数 N をコマンドライン引数などの手段で受け取り,入力のうち末尾の N 行だけを表示せよ.確認には tail コマンドを用いよ.
$ tail -n 5 popular-names.txt
Benjamin M 13381 2018
Elijah M 12886 2018
Lucas M 12585 2018
Mason M 12435 2018
Logan M 12352 2018
16. ファイルを N 分割する
自然数 N をコマンドライン引数などの手段で受け取り,入力のファイルを行単位で N 分割せよ.同様の処理を split コマンドで実現せよ.
$ split -l 200 popular-names.txt
17. 1列目の文字列の異なり
1 列目の文字列の種類(異なる文字列の集合)を求めよ.確認には cut, sort, uniq コマンドを用いよ.
$ cut -f 1 popular-names.txt | sort -s | uniq
Abigail
Aiden
Alexander
.
.
.
Virginia
Walter
William
18. 各行を 3 コラム目の数値の降順にソート
各行を 3 コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認には sort コマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).
$ sort -nrsk 3 ./popular-names.txt | head -n 5
Linda F 99689 1947
Linda F 96211 1948
James M 94757 1947
Michael M 92704 1957
Robert M 91640 1947
19. 各行の 1 コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる
各行の 1 列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認には cut, uniq, sort コマンドを用いよ.
$ cut -f 1 ./popular-names.txt | sort | uniq -c | sort -rn
118 James
111 William
108 Robert
.
.
.
1 Julie
1 Crystal
1 Carolyn
参考