フリーウェアでシミュレーション結果アニメーションを作る

コマンドラインのススメ

<< Prev - Index - Next >>

2. sed と awk

2.1 sed の基本


■ テキストデータの一部の変更や、ごく簡単な処理をしたい時には、いちいちそのためのプログラミングをするのも大げさすぎるが、手で行うにも量が多すぎるということが良くあります。ここでは置換ツールである sed と簡単な表計算ツールである awk について簡単に解説しておきます。

■ sed の基本的な使い方は次のようになります。主に使うオプションは -e と -f でしょう。
出力は標準出力として画面に表示されるので、ファイルに書き出すときは > を使います。

sed -e 置換のルール 置換を実行するファイル > 新規ファイル
sed -f ルールを記したファイル 置換を実行するファイル > 新規ファイル

■ 置換の文法は s/置換前/置換後/オプション です。
そのままだと行ごとに一度だけ、オプション g をつけると何度でも置換を行います。

■ 例えば、カンマで区切られたデータファイルを、タブ記号(\t)で区切られているデータに変換したい時には以下のように実行します。

$ sed -e 's/,/\t/g' Original.txt > New.txt

Original.txt
New.txt
100, 250, 320, 3
50, 45, 160, 6
100 250 320  3
50  45  160  6

■ 複数の変換を一度に行うときには -e オプションを複数配置することができます。
$ sed  -e 's/a/b/g' -e 's/c/d/g' Original.txt > New.txt
そのほかs///の置換コマンドを複数行書き込んだファイルを作成して、-f オプションで利用することができます。


2.2 sed の発展


■ sedは正規表現と呼ばれるルールを用いて、かなり複雑な処理を実現することができます。その一部を紹介します。さらに発展的な使い方では、「正規表現」をキーワードに検索してみてください。

■ かぎカッコによって複数の文字を表現できます。[abc]とするとaまたはbまたはcです。数字全部を表現するには[0-9]を使います。極端な例として
$ sed  -e 's/[0-9]/a/g' Original.txt > New.txt
とすると、数字が全部aに変化します

Original.txt
New.txt
100, 250, 320, 3
50, 45, 160, 6
aaa, aaa, aaa, a
aa, aa, aaa, a

■ \+か*で任意の長さの文字を表現します。\+は一文字以上、*は0文字も含みます。下の例では、何桁の数字もすべて一文字aになります。
$ sed  -e 's/[0-9]\+/a/g' Original.txt > New.txt
Original.txt
New.txt
100, 250, 320, 3
50, 45, 160, 6
a, a, a, a
a, a, a, a

■ \( \) で括った部分は \1, \2 \3,... として順番に記憶されて、置換後の文字列として使えます。これを使って、順番を入れ替えたり、カッコでくくったりなどの操作ができます。
$ sed  -e 's/\([0-9]*, [0-9]*, [0-9]*\),/<\1>/g' Original.txt > New.txt
Original.txt
New.txt
100, 250, 320, 3
50, 45, 160, 6
<100, 250, 320> 3
<50, 45, 160> 6

■ ^は行の頭を意味します。また、$は行末を意味します。
上の例と組み合わせて見ましょう。
$ sed  -f command.txt Original.txt > New.txt
command.txt
New.txt
s/^/sphere { /
s/\([0-9]*, [0-9]*, [0-9]*\),/<\1>/g
s/$/\n\t pigment { rgbt <1, 1, 1, 0>}\n}/
sphere { <100, 250, 320> 3
     pigment { rgbt <1, 1, 1, 0>}
}
sphere { <50, 45, 160> 6
     pigment { rgbt <1, 1, 1, 0>}
}

■ 置換後のテキストは、実際にPov-Rayで球を描かせるための命令文になっています。

■ これらの置換を駆使することで、生のシミュレーションデータから CG作成用のファイルの主要部分を直接作成することも可能です。


2.3 awk の基本


■ awkは簡単な表計算ソフトで、テキストファイルのある列だけにある計算をする、というようなことを行うことができます。

awk で使う表の区分けは空白やタブ記号なので、例えば元データがコンマで区切ってあるときは、sedなどを用いてコンマを空白やタブにします。

Original.txt(こっちは使えない)
OriginalB.txt(この形になっている必要がある)
100, 250, 320, 3
50, 45, 160, 6
100 250 320  3
50  45  160  6

■ awkの基本的な使い方は次のようになります。

 awk 表示のルール 対象のファイル > 新規ファイル

■ コマンドを実行すると、対象のファイルを読み込んで1列目を$1, 2列目を$2…として記憶します。それを任意のルールに従って表示することで、順番を入れ替えたりすることができます。

■ もっとも簡単な表示のルールは、かぎ括弧{}で囲んでの print でしょう。$nの順番を変えれば、列の順番も入れ替えることができます。そのまま並べて書くと、区切り無く直接表示されます。区切りが欲しい時はカンマを使います。

$ awk '{print $4 $3 $2 $1}' OriginalB.txt > NewB.txt
$ awk '{print $4,$3,$2,$1}' OriginalB.txt > NewB2.txt

OriginalB.txt
NewB.txt
NewB2.txt
100 250 320 3
50 45 160 6
3320250100
61604550
3 320 250 100
6 160 45 50

■ もちろん表計算ソフトなので、単に表を読んでそのまま表示するだけではなくて、計算などをさせることができます。

$ awk '{print $1*2,$2+$3,$4}' OriginalB.txt > NewB3.txt

OriginalB.txt
NewB.txt
100 250 320 3
50 45 160 6
200 570 3
100 205 6

2.4 awk の発展

■ 条件にしたがって表示させることができます。頭に余計なコメント行等を飛ばすことができます。
カッコの外の部分に条件(NR>1)を入れると、最初の一行を飛ばして表示します。(NRは行番号をあらわしています)
$0は行全体を現しています。
$ awk 'NR > 1 {print $0}' OriginalC.txt > NewC.txt

OriginalC.txt
NewC.txt
#comment
100, 250, 320, 3
50, 45, 160, 6
100, 250, 320, 3
50, 45, 160, 6

■ また、BEGIN と END を使って、最初と最後に表示をさせることができます。
(一行のコマンドを2行に分けて書いています)
awk 'BEGIN {print "this is first line\nthis is second line"}
NR > 1 {print $0} END {print "final line"}' OriginalC.txt > NewC.txt
OriginalC.txt
NewC.txt
#comment
100, 250, 320, 3
50, 45, 160, 6
this is first line
this is second line
100, 250, 320, 3
50, 45, 160, 6
final line

■ こうしたコマンド群を使うことで、手で変換するのは大変すぎるような量のデータの変換などをすることができます。


sed の詳しい使い方は、この日本語のブログ記事が詳細に書いてあるのでお勧め。
http://www.chimimo.com/post/8995558289/sed1
<< Prev - Index - Next >>
inserted by FC2 system