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

  • 0
    いいね
  • 0
    コメント

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

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

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

    12.1列目をcol1.txtに,2列目をcol2.txtに保存

    各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.

    出来上がったコード:

    main.py
    # coding: utf-8
    
    fname = 'hightemp.txt'
    with open(fname) as data_file, \
            open('col1.txt', mode='w') as col1_file, \
            open('col2.txt', mode='w') as col2_file:
        for line in data_file:
            cols = line.split('\t')
            col1_file.write(cols[0] + '\n')
            col2_file.write(cols[1] + '\n')
    

    実行結果:

    col1.txt
    高知県
    埼玉県
    岐阜県
    山形県
    山梨県
    和歌山県
    静岡県
    山梨県
    埼玉県
    群馬県
    群馬県
    愛知県
    千葉県
    静岡県
    愛媛県
    山形県
    岐阜県
    群馬県
    千葉県
    埼玉県
    大阪府
    山梨県
    山形県
    愛知県
    
    col2.txt
    江川崎
    熊谷
    多治見
    山形
    甲府
    かつらぎ
    天竜
    勝沼
    越谷
    館林
    上里見
    愛西
    牛久
    佐久間
    宇和島
    酒田
    美濃
    前橋
    茂原
    鳩山
    豊中
    大月
    鶴岡
    名古屋
    

    UNIXコマンドの確認は、シェルスクリプトで行いました。

    test.sh
    #!/bin/sh
    
    # col1の抽出と比較
    cut --fields=1 hightemp.txt > col1_test.txt
    diff --report-identical-files col1.txt col1_test.txt
    
    # col2の抽出と比較
    cut --fields=2 hightemp.txt > col2_test.txt
    diff --report-identical-files col2.txt col2_test.txt
    

    実行結果:

    端末
    ファイル col1.txt と col1_test.txt は同一です
    ファイル col2.txt と col2_test.txt は同一です
    

    無事、同じ結果になりました。

    UNIXコマンドの短いオプションと長いオプション

    UNIXコマンドのオプションは、短いものと長いものがペアになっていることが多いです。長い方が意味が分かりやすいので、このノックでは長い方を使っています。ただ、よく使うものは短いものを覚えた方が入力が楽ですね。

    今回使ったコマンドの短いオプションは次の通りです。詳細はmanでご確認ください。

    コマンド 今回使ったオプション 短いオプション 意味
    cut --fields -f 切り出すフィールドの番号
    diff --report-identical-files -s 比較結果が同じ場合も報告

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