言語処理100本ノックの挑戦記録です。
今回から、第2章: UNIXコマンドの基礎です!
hightemp.txtは,日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである.
以下の処理を行うプログラムを作成し,hightemp.txtを入力ファイルとして実行せよ.
さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ.
10. 行数のカウント
行数をカウントせよ.確認にはwcコマンドを用いよ.
Ruby
file_path = "hightemp.txt"
puts File.read(file_path).count("\n")
shell
cat hightemp.txt | wc -l
結果
24
11. タブをスペースに置換
タブ1文字につきスペース1文字に置換せよ.
確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.
Ruby
file_path = "hightemp.txt"
File.open(file_path) do |file|
file.each_line do |line|
puts line.gsub("\t", " ")
end
end
今回はtrコマンドでやってみました。
shell
cat hightemp.txt | tr '\t' ' '
12. 1列目をcol1.txtに,2列目をcol2.txtに保存
各行の1列目だけを抜き出したものをcol1.txtに,
2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.
確認にはcutコマンドを用いよ.
Ruby
file_path = "hightemp.txt"
prefectures = []
cities = []
File.open(file_path) do |file|
file.each_line do |line|
prefectures << line.split("\t")[0]
cities << line.split("\t")[1]
end
end
File.open("col1.txt", "w") do |file|
file.puts prefectures
end
File.open("col2.txt", "w") do |file|
file.puts cities
end
shell
cut -f 1 hightemp.txt
cut -f 2 hightemp.txt
結果
# col1.txt
高知県
埼玉県
岐阜県
山形県
山梨県
和歌山県
静岡県
山梨県
埼玉県
群馬県
群馬県
愛知県
千葉県
静岡県
愛媛県
山形県
岐阜県
群馬県
千葉県
埼玉県
大阪府
山梨県
# col2.txt
江川崎
熊谷
多治見
山形
甲府
かつらぎ
天竜
勝沼
越谷
館林
上里見
愛西
牛久
佐久間
宇和島
酒田
美濃
前橋
茂原
鳩山
豊中
大月
鶴岡
名古屋
13. col1.txtとcol2.txtをマージ
12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.
Ruby
prefectures = File.readlines("col1.txt").map(&:chomp)
cities = File.readlines("col2.txt").map(&:chomp)
pref_cities = [prefectures, cities].transpose.map{ |row| row.join("\t") }
File.open("pref_cities.txt", "w") do |file|
file.puts pref_cities
end
shell
paste -d "\t" col1.txt col2.txt
結果
高知県 江川崎
埼玉県 熊谷
岐阜県 多治見
山形県 山形
山梨県 甲府
和歌山県 かつらぎ
静岡県 天竜
山梨県 勝沼
埼玉県 越谷
群馬県 館林
群馬県 上里見
愛知県 愛西
千葉県 牛久
静岡県 佐久間
愛媛県 宇和島
山形県 酒田
岐阜県 美濃
群馬県 前橋
千葉県 茂原
埼玉県 鳩山
大阪府 豊中
山梨県 大月
山形県 鶴岡
愛知県 名古屋
UNIXコマンドも勉強しなければ...!