Traffine I/O

日本語

2023-02-03

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

はじめに

言語処理100本ノックというNLPに関する問題集が東京工業大学によって作成、管理されています。

https://nlp100.github.io/ja/ch02.html

この記事では、「第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

参考

https://nlp100.github.io/ja/about.html
https://nlp100.github.io/ja/ch02.html

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!