cutコマンドには-f
オプションがあり-d
区切りでスプリットした列の中から特定の列だけ抜き出すことができる。
しかし、列を入れ替えることはできない。
そこでRubyで入れ替えOKで好きな列を抜き出すスクリプトを書いたので紹介する。
require 'optparse' require 'ostruct' # コマンド使用例 # $ cat input.txt | ruby cut.rb -d'|' -f2,1,3 options = OpenStruct.new OptionParser.new do |opt| opt.on('-d', '--delimiter DELIMITER') { |o| options.delimiter = o } opt.on('-f', '--fields FIELD_STRING') { |o| options.field = o } end.parse! class Array def fields(indices) indices.map {|i| self[i] } end end indices = options.field.split(",").map(&:to_i) while gets puts $_.split(options.delimiter).fields(indices).join(options.delimiter) end
下の記事の中の表データを整形するときに上のコードを書いた。
初めの状態の表データは、以下。
|
区切りで「カード・セット名」、「発売日」、「スタンダード期限」の3つの列がある。
|ファイレクシア:完全なる統一(PHYREXIA ALL WILL BE ONE)|2023/2/3|2024年秋まで| |兄弟戦争(THE BROTHERS WAR)|2022/11/18|2024年秋まで| |団結のドミナリア(DOMINARIA UNITED)|2022/9/9|2024年秋まで| |ニューカペナの街角(STREETS OF NEW CAPENNA)|2022/4/29|2023年秋まで| |神河:輝ける世界(KAMiGAWA NEON DYNASTY)|2022/2/18|2023年秋まで| |イニストラード:真紅の契り|2021/11/19|2023年秋まで| |イニストラード:真夜中の狩り|2021/9/24|2023年秋まで| |フォーゴトン・レルム探訪|2021/7/23|2022年秋まで| |ストリクスヘイヴン:魔法学院|2021/4/23|2022年秋まで| |カルドハイム|2021/2/5|2022年秋まで| |ゼンディカーの夜明け|2020/9/25|2022年秋まで| |基本セット2021|2020/7/3|2021年秋まで| |イコリア:巨獣の棲処|2020/4/17|2021年秋まで| |テーロス還魂記|2020/1/24|2021年秋まで| |エルドレインの王権|2019/10/4|2021年秋まで| |基本セット2020|2019/7/12|2020年秋まで| |灯争大戦|2019/5/3|2020年秋まで| |ラヴニカの献身|2019/1/25|2020年秋まで| |ラヴニカのギルド|2018/10/5|2020年秋まで|
この表データの「発売日」の列を1列目に持ってくるようにするのに、もう一つスクリプトを書いてそれらを組み合わせた。
そのスクリプトの内容は、各行の先頭と末尾に文字列を追加するだけのコードです。
cut.rb
を実行すると先頭と末尾の|
は取り除かれてしまうので、それを追加するだけのコードです。
require 'optparse' require 'ostruct' options = OpenStruct.new OptionParser.new do |opt| opt.on('-q', '--quote QUOTE_STRING') { |o| options.quote = o } opt.on('-o', '--open OPEN_STRING') { |o| options.open = o } opt.on('-c', '--close CLOSE_STRING') { |o| options.close = o } end.parse! while gets line = (options.open || options.quote) + $_.chomp + (options.close || options.quote) puts line end
実行結果
src/mtg % cat matrix2.txt | ruby cut.rb -d'|' -f2,1,3 | ruby quote.rb -q'|' |2023/2/3|ファイレクシア:完全なる統一(PHYREXIA ALL WILL BE ONE)|2024年秋まで| |2022/11/18|兄弟戦争(THE BROTHERS WAR)|2024年秋まで| |2022/9/9|団結のドミナリア(DOMINARIA UNITED)|2024年秋まで| |2022/4/29|ニューカペナの街角(STREETS OF NEW CAPENNA)|2023年秋まで| |2022/2/18|神河:輝ける世界(KAMiGAWA NEON DYNASTY)|2023年秋まで| |2021/11/19|イニストラード:真紅の契り|2023年秋まで| |2021/9/24|イニストラード:真夜中の狩り|2023年秋まで| |2021/7/23|フォーゴトン・レルム探訪|2022年秋まで| |2021/4/23|ストリクスヘイヴン:魔法学院|2022年秋まで| |2021/2/5|カルドハイム|2022年秋まで| |2020/9/25|ゼンディカーの夜明け|2022年秋まで| |2020/7/3|基本セット2021|2021年秋まで| |2020/4/17|イコリア:巨獣の棲処|2021年秋まで| |2020/1/24|テーロス還魂記|2021年秋まで| |2019/10/4|エルドレインの王権|2021年秋まで| |2019/7/12|基本セット2020|2020年秋まで| |2019/5/3|灯争大戦|2020年秋まで| |2019/1/25|ラヴニカの献身|2020年秋まで| |2018/10/5|ラヴニカのギルド|2020年秋まで|