言語処理100本ノックの挑戦記録です。
今回は、テキストファイルから指定した範囲の行数を取得・分割する処理です。
14. 先頭からN行を出力
自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.
Ruby
file_name = "hightemp.txt"
lines = File.readlines(file_name)
n = ARGV[0].to_i
puts lines.slice(0...n)
shell
head hightemp.txt
N = 10 の場合
結果
高知県 江川崎 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
headコマンドは、-[数字]というオプションを指定することで任意の行数を指定できるそうな。
例
head -5 hightemp.txt
15. 末尾のN行を出力
自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.
Ruby
file_name = "hightemp.txt"
lines = File.readlines(file_name)
n = [ARGV[0].to_i, lines.length].min
exit if n == 0
puts lines.slice(-n..-1)
tailコマンドも、-[数字] オプションで行数指定できるんですね。
shell
tail -5 hightemp.txt
結果
埼玉県 鳩山 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
16. ファイルをN分割する
自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.
Ruby
file_name = "hightemp.txt"
lines = File.readlines(file_name)
n = ARGV[0].to_i
lines.each_slice(n).each_with_index do |line, i|
File.open("split_hightemp_#{i}.txt", "w") { |file| file.puts line }
end
N = 5 の場合
-l オプションで行数を指定しました。
shell
split -l 5 hightemp.txt
本日はここまでー!