言語処理100本ノックの挑戦記録です。
今回も引き続きファイルの読み込み処理と、
読み込んだデータのソートが課題です。
17. 1列目の文字列の異なり
1列目の文字列の種類(異なる文字列の集合)を求めよ.
確認にはsort,uniqコマンドを用いよ.
Ruby
file_name = "hightemp.txt"
lines = File.readlines(file_name)
strings = []
File.open(file_name) do |file|
file.each_line do |line|
strings << line.split(/\t/).first
end
end
puts strings.uniq.sort
shell
cut -f 1 hightemp.txt | sort | uniq
結果
千葉県
埼玉県
大阪府
山形県
山梨県
岐阜県
愛媛県
愛知県
群馬県
静岡県
高知県
和歌山県
18. 各行を3コラム目の数値の降順にソート
各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).
確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).
Ruby
file_name = "hightemp.txt"
lines = File.readlines(file_name)
ROW_TEMP = 2
puts lines.sort_by { |line| -line.split(/\t/)[ROW_TEMP].to_f }
sortコマンド
sortコマンドに関して、こちらの記事を参考にさせていただきました。感謝です!
3カラム目の逆順なので、
-k
で並び替える列を指定してあげます。
n
で、数値の順番でソートします。
r
を指定すると降順になります。
shell
sort -k 3nr,3 hightemp.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-04
和歌山県 かつらぎ 40.6 1994-08-08
山梨県 勝沼 40.5 2013-08-10
埼玉県 越谷 40.4 2007-08-16
愛知県 愛西 40.3 1994-08-05
群馬県 館林 40.3 2007-08-16
群馬県 上里見 40.3 1998-07-04
千葉県 牛久 40.2 2004-07-20
愛媛県 宇和島 40.2 1927-07-22
静岡県 佐久間 40.2 2001-07-24
山形県 酒田 40.1 1978-08-03
群馬県 前橋 40 2001-07-24
岐阜県 美濃 40 2007-08-16
山形県 鶴岡 39.9 1978-08-03
山梨県 大月 39.9 1990-07-19
大阪府 豊中 39.9 1994-08-08
埼玉県 鳩山 39.9 1997-07-05
千葉県 茂原 39.9 2013-08-11
愛知県 名古屋 39.9 1942-08-02
19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる
各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.
確認にはcut, uniq, sortコマンドを用いよ.
今回はRuby標準ライブラリのcsvを使ってみました。
Ruby
require "csv"
file_name = "hightemp.txt"
table = CSV.table(file_name, col_sep: "\t", headers: %w(pref city temperature day))
prefs = table[:pref].group_by(&:itself).map { |k, v| { "#{k}": v.count } }
sorted_prefs = prefs.sort_by{ |pref| pref.values }.reverse
sorted_prefs.each do |hash|
puts "#{hash.keys.first} : #{hash.values.first}"
end
シェルだとこんな具合です。
1カラム目なので、-f
で指定してあげます。
shell
cut -f 1 hightemp.txt | sort | uniq -c | sort -r
結果
3 群馬県
3 山梨県
3 山形県
3 埼玉県
2 静岡県
2 愛知県
2 岐阜県
2 千葉県
1 和歌山県
1 高知県
1 愛媛県
1 大阪府
まとめ
UNIXコマンド、自在に使えたら便利!精進しなければ...!
次回、第3章: 正規表現 です!!
これまでの挑戦
第1章: 準備運動
第2章: UNIXコマンドの基礎