言語処理100本ノック 2015 第2章 10〜14

言語処理100本ノック 2015」の「第2章: UNIXコマンドの基礎」、10〜14。

10. 行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ.

単純にカウントアップするだけのプログラムにしてみました。

import argparse


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('infile', type=argparse.FileType('r'))
    args = parser.parse_args()

    count = 0
    for line in args.infile:
        count += 1

    print(count)


if __name__ == '__main__':
    main()

11. タブをスペースに置換

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

これも単純に1行ずつ読みながら、タブ文字からスペースにreplaceするだけのプログラムにしてみました。

import argparse


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('infile', type=argparse.FileType('r'))
    args = parser.parse_args()

    for line in args.infile:
        print(line.replace('\t', ' '), end='')


if __name__ == '__main__':
    main()

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

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

課題ではファイル名を固定にしていますが、ファイル名はコマンドラインパラメータで設定するようにしてみました。

import argparse


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('infile', type=argparse.FileType('r'))
    parser.add_argument('outfile1', type=argparse.FileType('w'))
    parser.add_argument('outfile2', type=argparse.FileType('w'))
    args = parser.parse_args()

    for line in args.infile:
        t = line.split()
        args.outfile1.write(t[0] + '\n')
        args.outfile2.write(t[1] + '\n')


if __name__ == '__main__':
    main()

13. col1.txtとcol2.txtをマージ

12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.

これもコマンドラインでファイルを指定できるようにしてみました。

import argparse


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('infile1', type=argparse.FileType('r'))
    parser.add_argument('infile2', type=argparse.FileType('r'))
    parser.add_argument('outfile', type=argparse.FileType('w'))
    args = parser.parse_args()

    for c1, c2 in zip(args.infile1, args.infile2):
        args.outfile.write(c1.rstrip('\r\n') + '\t' + c2.rstrip('\r\n') + '\n')


if __name__ == '__main__':
    main()

args.infile1、args.infile2からファイルを読み込んでいますが、改行が入った状態になっていたので、rstripを使って改行文字を削除しています。

14. 先頭からN行を出力

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

これは極めて単純な実装です。

import argparse


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('infile', type=argparse.FileType('r'))
    parser.add_argument('count', type=int)
    args = parser.parse_args()

    count = 0
    for line in args.infile:
        print(line, end='')
        count += 1

        if args.count <= count:
            return


if __name__ == '__main__':
    main()


とりあえず今日はこんなところで。

スポンサーリンク

フォローする

スポンサーリンク