ユニクロのマスクがお気に入り。ko_ya346です。
言語処理100本ノック2020(Rev 2)を始めたので解法をまとめていきます。
今回は第2章です。
確認のためのUNIXコマンドの方に苦戦しました。
- 10. 行数のカウント
- 11. タブをスペースに置換
- 12. 1列目をcol1.txtに,2列目をcol2.txtに保存
- 13. col1.txtとcol2.txtをマージ
- 14. 先頭からN行を出力
- 15. 末尾のN行を出力
- 16. ファイルをN分割する
- 17. 1列目の文字列の異なり
- 18. 各行を3コラム目の数値の降順にソート
- 19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる
popular-names.txtは,アメリカで生まれた赤ちゃんの「名前」「性別」「人数」「年」をタブ区切り形式で格納したファイルである.
以下の処理を行うプログラムを作成し,popular-names.txtを入力ファイルとして実行せよ.
さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ.
10. 行数のカウント
行数をカウントせよ.確認にはwcコマンドを用いよ.
with open("popular-names.txt", "r") as f: cnt = 0 for _ in f: cnt += 1 print(cnt)
wc -l popular-names.txt
11. タブをスペースに置換
タブ1文字につきスペース1文字に置換せよ.
確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.
with open("popular-names.txt", "r") as f: t = f.read() print(t.replace("\t", " "))
cat popular-names.txt | sed -e 's/\t/ /g' > 11.txt
12. 1列目をcol1.txtに,2列目をcol2.txtに保存
各行の1列目だけを抜き出したものをcol1.txtに,
2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.
確認にはcutコマンドを用いよ.
import pandas as pd df = pd.read_csv("popular-names.txt", sep="\t", header=None) df[0].to_csv("col1.txt", index=False, header=None) df[1].to_csv("col2.txt", index=False, header=None)
cut -f 1 -d " " 11.txt cut -f 2 popular-names.txt
13. col1.txtとcol2.txtをマージ
12で作ったcol1.txtとcol2.txtを結合し,
元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.
確認にはpasteコマンドを用いよ.
d1 = pd.read_csv("col1.txt", header=None) d2 = pd.read_csv("col2.txt", header=None) d = pd.concat([d1, d2], axis=1) d.to_csv("13.txt", sep="\t", header=None)
paste -d "\t" col1.txt col2.txt
複数のreplaceをまとめて実行する方法ってないんですかね?
14. 先頭からN行を出力
自然数Nをコマンドライン引数などの手段で受け取り,
入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.
N = int(input()) df = pd.read_csv("popular-names.txt", sep="\t", header=None) df.head(N)
head -n 1 popular-names.txt
15. 末尾のN行を出力
自然数Nをコマンドライン引数などの手段で受け取り,
入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.
N = int(input()) df = pd.read_csv("popular-names.txt", sep="\t", header=None) df.tail(N)
tail -n 1 popular-names.txt
16. ファイルをN分割する
自然数Nをコマンドライン引数などの手段で受け取り,
入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.
N = int(input()) df = pd.read_csv("popular-names.txt", sep="\t", header=None) lcut = len(df)//N for i in range(N): if i==N-1: display(df.iloc[i*lcut:]) else: display(df.iloc[i*lcut:(i+1)*lcut])
split -n 3 popular-names.txt
17. 1列目の文字列の異なり
1列目の文字列の種類(異なる文字列の集合)を求めよ.
確認にはcut, sort, uniqコマンドを用いよ.
df = pd.read_csv("popular-names.txt", sep="\t", header=None) np.sort(df[0].unique())
cut -f 1 popular-names.txt | sort | uniq
18. 各行を3コラム目の数値の降順にソート
各行を3コラム目の数値の逆順で整列せよ
(注意: 各行の内容は変更せずに並び替えよ).
確認にはsortコマンドを用いよ
(この問題はコマンドで実行した時の結果と合わなくてもよい).
df = pd.read_csv("popular-names.txt", sep="\t", header=None) df.sort_values(2, ascending=False)
sort -k 3 -r popular-names.txt
19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる
各行の1列目の文字列の出現頻度を求め,
その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.
df = pd.read_csv("popular-names.txt", sep="\t", header=None) df[0].value_counts()
cut -f 1 popular-names.txt | sort | uniq -c | sort -r