1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rubyで言語処理100本ノック 第2章: UNIXコマンドの基礎 (17 ~ 19)

Last updated at Posted at 2018-06-24

言語処理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コマンドの基礎

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?