今日からつかえるワンライナー:特定行の抜き出し
宮森望この記事は 茨大 Advent Calendar 2020 2日目の記事です。
ワンライナーとは
1行で書くプログラムもしくはコマンドのこと
今日のお題:特定行の抜き出し
必要なもの
ターミナル
bash
例:1行目,3行目,5行目の抜き出し
ターミナル(bash上で)次のように入力
sed -n '1p;3p;5p;5q' file
解説
sed
Stream EDitorの略らしい。テキスト処理特化型言語。茨大情報工に身近なところだと、perlのご先祖様とも言える。さらに言うと行指向型のテキスト処理言語。行指向というのは、入力に対して1行ずつ命令を実行するようなやつ。他の行指向言語/プログラムだとawkとか、grepがいる。
-n
sedはデフォルトだと現在の入力行に対して命令を全て実行した後(例だと1p;3p;5p;5qが終わった後)、現在の入力行を出力する。-nはその動作を抑制し、全命令実行後に現在行を出力しないようにする。
'1p;3p;5p;5q'
1p、3p、5p、5qの4つの命令を渡している。引用符はbashがセミコロンを過って解釈しないために必要。セミコロンはsedに渡す命令の区切り。
1p、3p、5p、5qの数字1、3、5は行番号のこと。pはprintのこと、つまり1p、3p、5pはそれぞれ、1行目、3行目、5行目を出力(もう少し正確に書くと現在の入力行がそれぞれ、1行目、3行目、5行目ならばpが実行される)。5qのqはquitのことで、ここでは5行目を読むとプログラムを終了する。
file
処理したいファイル名
まとめ
ワンライナーというよりsedの紹介でした。紹介したのはsedのほんの一部です。sedが持ってる正規表現の機能とか使うともうちょい複雑なこともできます。テキスト処理といえば(私の中では)まずはsedというくらい有能な子なので、みなさんも思い出したら使ってみてください。
明日はまさひこまさおさんの昼休みの20分で書いたやつです。
おまけ:-nをつけない場合
sed '1p;3p;5q;d' file
dはdeleteのことで、現在の入力行を消す。5qでプログラム終了時に5行目は自動で出力される(-nが無いので)。