<jupyter_start><jupyter_text>第2章: UNIXコマンドpopular-names.txtは，アメリカで生まれた赤ちゃんの「名前」「性別」「人数」「年」をタブ区切り形式で格納したファイルである．以下の処理を行うプログラムを作成し，popular-names.txtを入力ファイルとして実行せよ．さらに，同様の処理をUNIXコマンドでも実行し，プログラムの実行結果を確認せよ．<jupyter_code>!wget https://nlp100.github.io/data/popular-names.txt<jupyter_output>--2020-06-01 11:12:13--  https://nlp100.github.io/data/popular-names.txt
Resolving nlp100.github.io (nlp100.github.io)... 192.168.127.12, 192.168.127.12, 192.168.3.11, ...
Connecting to nlp100.github.io (nlp100.github.io)|192.168.127.12|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 55026 (54K) [text/plain]
Saving to: ‘popular-names.txt’


popular-names.txt     0%[                    ]       0  --.-KB/s               
popular-names.txt   100%[===================>]  53.74K  --.-KB/s    in 0.03s   

2020-06-01 11:12:13 (1.96 MB/s) - ‘popular-names.txt’ saved [55026/55026]<jupyter_text>10. 行数のカウント***行数をカウントせよ．確認にはwcコマンドを用いよ．<jupyter_code>import pandas as pd

df = pd.read_table('./popular-names.txt', header=None, sep='\t', names=['name', 'sex', 'number', 'year'])
print(len(df))
# 確認
!wc -l ./popular-names.txt<jupyter_output>2780 ./popular-names.txt<jupyter_text>11. タブをスペースに置換***タブ1文字につきスペース1文字に置換せよ．確認にはsedコマンド，trコマンド，もしくはexpandコマンドを用いよ．<jupyter_code># 確認
!sed -e 's/\t/ /g' ./popular-names.txt | head -n 5<jupyter_output>Mary F 7065 1880
Anna F 2604 1880
Emma F 2003 1880
Elizabeth F 1939 1880
Minnie F 1746 1880<jupyter_text>12. 1列目をcol1.txtに，2列目をcol2.txtに保存***各行の1列目だけを抜き出したものをcol1.txtに，2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ．確認にはcutコマンドを用いよ．<jupyter_code>col1 = df['name']
col1.to_csv('./col1.txt', index=False)
print(col1.head())
# 確認
!cut -f 1 ./popular-names.txt > ./col1_chk.txt
!cat ./col1_chk.txt | head -n 5
col2 = df['sex']
col2.to_csv('./col2.txt', index=False)
print(col2.head())
!cut -f 2 ./popular-names.txt > ./col2_chk.txt
!cat ./col2_chk.txt | head -n 5<jupyter_output>F
F
F
F
F<jupyter_text>13. col1.txtとcol2.txtをマージ***12で作ったcol1.txtとcol2.txtを結合し，元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ．確認にはpasteコマンドを用いよ．<jupyter_code>col1 = pd.read_table('./col1.txt')
col2 = pd.read_table('./col2.txt')
merged_1_2 = pd.concat([col1, col2], axis=1)
merged_1_2.to_csv('./merged_1_2.txt', sep='\t', index=False)
print(merged_1_2.head())
# 確認
!paste ./col1_chk.txt ./col2_chk.txt | head -n 5<jupyter_output>Mary	F
Anna	F
Emma	F
Elizabeth	F
Minnie	F<jupyter_text>14. 先頭からN行を出力***自然数Nをコマンドライン引数などの手段で受け取り，入力のうち先頭のN行だけを表示せよ．確認にはheadコマンドを用いよ．<jupyter_code>def output_head(N):
  print(df.head(N))
output_head(5)
# 確認
!head -n 5 ./popular-names.txt<jupyter_output>Mary	F	7065	1880
Anna	F	2604	1880
Emma	F	2003	1880
Elizabeth	F	1939	1880
Minnie	F	1746	1880<jupyter_text>15. 末尾のN行を出力***自然数Nをコマンドライン引数などの手段で受け取り，入力のうち末尾のN行だけを表示せよ．確認にはtailコマンドを用いよ．<jupyter_code>def output_tail(N):
  print(df.tail(N))
output_tail(5)
# 確認
!tail -n 5 ./popular-names.txt<jupyter_output>Benjamin	M	13381	2018
Elijah	M	12886	2018
Lucas	M	12585	2018
Mason	M	12435	2018
Logan	M	12352	2018<jupyter_text>16. ファイルをN分割する***自然数Nをコマンドライン引数などの手段で受け取り，入力のファイルを行単位でN分割せよ．同様の処理をsplitコマンドで実現せよ．<jupyter_code>def split_file(N):
  tmp = df.reset_index(drop=False)
  df_cut = pd.qcut(tmp.index, N, labels=[i for i in range(N)])
  df_cut = pd.concat([df, pd.Series(df_cut, name='sp')], axis=1)

  return df_cut
  
df_cut = split_file(10)
print(df_cut['sp'].value_counts())
print(df_cut.head())
!split -l 200 -d ./popular-names.txt sp<jupyter_output><empty_output><jupyter_text>17. １列目の文字列の異なり***1列目の文字列の種類（異なる文字列の集合）を求めよ．確認にはcut, sort, uniqコマンドを用いよ．<jupyter_code>print(len(df.drop_duplicates(subset='name')))
# 確認
!cut -f 1 ./popular-names.txt | sort | uniq | wc -l<jupyter_output>136<jupyter_text>18. 各行を3コラム目の数値の降順にソート***各行を3コラム目の数値の逆順で整列せよ（注意: 各行の内容は変更せずに並び替えよ）．確認にはsortコマンドを用いよ（この問題はコマンドで実行した時の結果と合わなくてもよい）．<jupyter_code>df.sort_values(by='number', ascending=False, inplace=True)
print(df.head())
# 確認
!cat ./popular-names.txt | sort -rnk 3 | head -n 5<jupyter_output>Linda	F	99689	1947
Linda	F	96211	1948
James	M	94757	1947
Michael	M	92704	1957
Robert	M	91640	1947<jupyter_text>19. 各行の1コラム目の文字列の出現頻度を求め，出現頻度の高い順に並べる***各行の1列目の文字列の出現頻度を求め，その高い順に並べて表示せよ．確認にはcut, uniq, sortコマンドを用いよ．<jupyter_code>print(df['name'].value_counts())
# 確認
!cut -f 1 ./popular-names.txt | sort | uniq -c | sort -rn | head -n 5<jupyter_output>118 James
    111 William
    108 Robert
    108 John
     92 Mary
{'fraction_non_alphanumeric': 0.15472910927456382, 'fraction_numerical': 0.0945821854912764, 'mean_word_length': 5.454814814814815, 'pattern_counts': {'":': 0, '<': 35, '<?xml version=': 0, '>': 38, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 4, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '571828', 'license': 'MIT', 'n_tokens_mistral': 2671, 'n_tokens_neox': 2449, 'n_words': 312, 'path': 'chapter02.ipynb', 'repo_name': 'hanamame123/nlp100', 'size': '4362'}