脳筋プログラミング

筋トレ大好きな初心者プログラマーの備忘録です。

言語処理100本ノック(15〜19)

15.末尾のN行を出力

問題:自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.

解答(Python):

import sys

args = sys.argv

basefile = open('hightemp.txt')
basefile_line = basefile.readlines()
basefile_line_len = len(basefile_line)
displayline = basefile_line_len - int(args[1]) + 1

for x, y in reversed(list(enumerate(basefile_line, start=1))):
    print(y)
    if x == displayline:
        break


basefile.close()

##########結果##########

(コマンドラインで3を入力した場合)

愛知県   名古屋   39.9   1942-08-02
山形県   鶴岡  39.9   1978-08-03
山梨県   大月  39.9   1990-07-19

解答(Unixコマンド):

$ tail -n 3 hightemp.txt

##########結果##########

山梨県   大月  39.9    1990-07-19
山形県   鶴岡  39.9    1978-08-03
愛知県   名古屋   39.9    1942-08-02

考察:Pythonではreversedしていますので、逆順です。なので、Unixコマンドの結果とは逆になっています。あんまり綺麗ではない...スライスで切り出して表示とかの方がいいのでしょうが、ひとまずこれで完了とします。

16.ファイルをN分割する

問題:自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

解答(Python):

import sys
import itertools

args = sys.argv

basefile = open('hightemp.txt')
basefile_line = basefile.readlines()

split_after = [x for x in itertools.zip_longest(*[iter(basefile_line)]*int(args[1]))]

for x, y in enumerate(split_after, start=0):
    flopen = open('split_{0}.txt'.format(x + 1), 'w')
    for z in split_after[x]:
        if z is not None:
            flopen.write(z)
    flopen.close()

basefile.close()

##########結果##########

(コマンドラインで7を入力した場合)

◯split_1.txt
高知県   江川崎   41 2013-08-12
埼玉県   熊谷  40.9   2007-08-16
岐阜県   多治見   40.9   2007-08-16
山形県   山形  40.8   1933-07-25
山梨県   甲府  40.7   2013-08-10
和歌山県    かつらぎ    40.6   1994-08-08
静岡県   天竜  40.6   1994-08-04

◯split_2.txt
山梨県   勝沼  40.5   2013-08-10
埼玉県   越谷  40.4   2007-08-16
群馬県   館林  40.3   2007-08-16
群馬県   上里見   40.3   1998-07-04
愛知県   愛西  40.3   1994-08-05
千葉県   牛久  40.2   2004-07-20
静岡県   佐久間   40.2   2001-07-24

(以下、split_4.txtまで繰り返しのため省略)

解答(Unixコマンド):

$ split -l 7 hightemp.txt split_

##########結果##########

split_aa〜split_adでファイル出力。内容はPython版と変わらず。

考察:コマンド引数ごとに分割する方法を最初はzipでやっていたのですが、余剰がある場合は切り捨てられるという自体に陥ってどうしようと思っていたら、丁度良い記事が見つかりました。 (参考:リストをn個ずつのサブリストに分割 (Python) - おぎろぐはてブロUnixコマンドでは「-d」オプションで出力するファイル名をPython版で統一しようと思ったら「split: -d: illegal line count」と言われました。何でだ...と調べたら、OS X版のsplitには存在しないということでした。 (参考:macos - -d option for split is illegal on OS X 10.9 - Ask Different

17.1列目の文字列の異なり

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

解答(Python):

basefile = open('col1.txt')
line = basefile.readlines()

commonlist = {x.replace('\n', '') for x in line}

basefile.close()

for y in commonlist:
    print(y)

##########結果##########

岐阜県
埼玉県
千葉県
愛知県
愛媛県
大阪府
高知県
静岡県
和歌山県
群馬県
山梨県
山形県

解答(Unixコマンド):

$ cat col1.txt | sort | uniq

##########結果##########

Python版と同じ

考察:なし