脳筋プログラミング

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

言語処理100本ノック(10〜14)

10.行数のカウント

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

解答(Python):

print(len(open('hightemp.txt', 'r').readlines()))

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

24

解答(Unixコマンド):

$ wc -l  hightemp.txt

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

24 hightemp.txt

考察:別解でこんな書き方もありました。

解答(Python):

print(sum(1 for i in open('hightemp.txt', 'r')))

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

24

【2018/1/5 追記】 こちらで質問させていただいたのですが、subprocessでwcを利用した方法もあるとのこと。

teratail.com

解答(Python):

import subprocess

run = subprocess.getoutput
t = run('wc -l {0}'.format('hightemp.txt'))
print(t)

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

24 hightemp.txt

Python奥が深いですね。とても勉強になります!

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

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

解答(Python):

basefile = open('hightemp.txt', 'r')
newfile = open('hightemp_new.txt', 'w')

for s in basefile:
    s = s.expandtabs(1)
    newfile.write(s)

newfile.close()
basefile.close()

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

高知県 江川崎 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
山梨県 勝沼 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
愛媛県 宇和島 40.2 1927-07-22
山形県 酒田 40.1 1978-08-03
岐阜県 美濃 40 2007-08-16
群馬県 前橋 40 2001-07-24
千葉県 茂原 39.9 2013-08-11
埼玉県 鳩山 39.9 1997-07-05
大阪府 豊中 39.9 1994-08-08
山梨県 大月 39.9 1990-07-19
山形県 鶴岡 39.9 1978-08-03
愛知県 名古屋 39.9 1942-08-02

解答(Unixコマンド):

$ cat hightemp.txt | tr '\t' ' ' > hightemp_new2.txt

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

Python版と同じ

考察:なし

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

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

解答(Python):

basefile = open('hightemp.txt', 'r')
col1 = open('col1.txt', 'w')
col2 = open('col2.txt', 'w')

for x in basefile:
    col1.write(x.split('\t')[0] + '\n')
    col2.write(x.split('\t')[1] + '\n')

col2.close()
col1.close()
basefile.close()

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

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

(col2.txt)
江川崎
熊谷
多治見
山形
甲府
かつらぎ
天竜
勝沼
越谷
館林
上里見
愛西
牛久
佐久間
宇和島
酒田
美濃
前橋
茂原
鳩山
豊中
大月
鶴岡
名古屋

解答(Unixコマンド):

$ cut -f 1 hightemp.txt > col1_unix.txt
$ cut -f 2 hightemp.txt > col2_unix.txt

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

Python版と同じ

考察:なし

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

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

解答(Python):

col1 = open('col1.txt', 'r')
col2 = open('col2.txt', 'r')
col3 = open('col3.txt', 'w')  # マージ用のファイルを事前に作成

for x, y in zip(col1, col2):
    col3.write(x.replace('\n', '\t') + y)

col2.close()
col1.close()
col3.close()

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

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

解答(Unixコマンド):

paste col1.txt col2.txt > col3.txt

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

Python版と同じ

考察:なし

14.先頭からN行を出力

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

解答(Python):

import sys

args = sys.argv

displayline = int(args[1])
basefile = open('hightemp.txt', 'r')

print(args[1])

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

basefile.close()

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

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

高知県   江川崎   41 2013-08-12

埼玉県   熊谷  40.9   2007-08-16

岐阜県   多治見   40.9   2007-08-16

解答(Unixコマンド):

$ head -n 3 hightemp.txt

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

Python版と同じ

考察:なし