素人の言語処理100本ノック:17


言語処理100本ノック 2015の挑戦記録です。環境はUbuntu 16.04 LTS + Python 3.5.2 :: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧はこちらからどうぞ。

第2章: UNIXコマンドの基礎

hightemp.txtは,日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである.以下の処理を行うプログラムを作成し,hightemp.txtを入力ファイルとして実行せよ.さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ.

17.1列目の文字列の異なり

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

出来上がったコード:

main.py
# coding: utf-8

fname = 'hightemp.txt'
with open(fname) as data_file:

    set_ken = set()
    for line in data_file:
        cols = line.split('\t')
        set_ken.add(cols[0])

for n in set_ken:
    print(n)

実行結果:

実行結果1
山形県
和歌山県
岐阜県
大阪府
愛媛県
埼玉県
愛知県
高知県
群馬県
千葉県
山梨県
静岡県
実行結果2
岐阜県
山形県
静岡県
愛知県
大阪府
高知県
群馬県
千葉県
山梨県
愛媛県
和歌山県
埼玉県

2回実行すると並びが変わりました。これは、コマンドラインの-Rオプションの解説にあるように、ハッシュがランダム化されているためだと思います。

UNIXコマンド確認用のシェルスクリプト:

test.sh
#!/bin/sh

# 先頭カラムを切り出し、ソート、重複除去
cut --fields=1 hightemp.txt | sort | uniq > result_test.txt

# Pythonのプログラムで実行、diffで比較するためにソート
python main.py | sort > result.txt

# 結果の確認
diff --report-identical-files result.txt result_test.txt

結果の確認:

端末
segavvy@ubuntu:~/ドキュメント/言語処理100本ノック2015/17$ ./test.sh
ファイル result.txt と result_test.txt は同一です

  
18本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。