たつをの ChangeLog : 2015-09-09

sed は行単位で文字列処理を行うプログラム。
文字や行の削除、挿入、置換などができる。
標準入力を処理して標準出力に出すフィルタとして機能する。

レシピ


先頭/末尾の一行を消す:
sed 1d
sed '$d'

1行目から10行目を消す/出す:
sed 1,10d
sed '1,10!d'
sed -n 1,10p

「RT」が含まれる行を消す/出す:
sed /RT/d
sed -n /RT/p

1行目から2行おきに消す/出す:
sed 1~2d
sed -n 1~2p

1行目はそのまま出し残りの行はマッチした行だけ出す:
sed -ne 1p -e /RT/p

2行目の前/後に文字列/改行を挿入:
sed '2i 文字列'
sed '2i \\'
sed '2a 文字列'
sed '2a \\'

空行を削す:
sed '/^$/d'

行頭から3番目に登場したタブを消す:
sed -r 's/\t//3'

条件にマッチしたファイルの中身を置き換える:
find . -name "*.txt" | xargs sed -i 's/\t/ /g'
grep -rl "hello" . | xargs sed -i s/hello/HELLO/

正規表現:後方参照、大文字小文字、個数指定、OR
echo 'ABCDE...vwxyz' | sed -r 's/([A-D])/\L\1/g;s/([w-z])/\U\1/g'
echo ' A\n  B\nC' | sed -r 's/^ {1,4}/\t/;s/(A|C)/X/g'

条件にマッチした行の前に行を追加:
sed '/ABC/i ###あやしいK###'

ホールドスペースを使って行を逆順にする: catの逆のtacと同等
sed -n 'G;h;$p'  aa.txt

オプションやコマンド


  • d : 行を消す。
  • !d : 指定以外の行を消す。
  • p : 表示。明示的に。"-n" との組み合わせ。
  • $ : 最後の行を表す。
  • = : 現在の行番号
  • i,a : 文字列の挿入
  • "-e" (or オプションなし) : 弱い正規表現。
  • "-r" or "-E" : perl などに近い正規表現。
  • "-u" : unbufferd. "tail -f" との組み合わせなどに。
  • "-n" : 各行を表示しない。
  • "-i" : ファイルを直接書き換える。

参考


この記事に言及しているこのブログ内の記事

awk はテキスト形式のデータの処理を得意とするプログラミング言語。sed と同じで、複雑なことは苦手だけど手軽で便利。

以下、ワンライナー利用を前提とした awk の必要最小限のメモ。

レシピ


指定フィールド(カラム)を表示:
awk '{print $1}'
awk '{print $3,$2}'

条件にあったら出す:
awk '$1 > 0 {print $2} $1 <= {print $1}'
awk '$1=="P" {print NR, $0}'
awk '{if($1<-1 || 5<$1) print}'
awk '{if($1>0 && $1<10)print"P";else print}'

正規表現:
awk '/RT/ {print NR,$0}'
awk '$2~/RT/ {printf("%06d %s\n", NR,$1)}'

正規表現でのマッチ箇所の取り出し・後方参照・文字列置換:
awk 'match($0, /(P|N)/) {print substr($0, RSTART, RLENGTH)}'
gawk {'print gensub(/^(.)\t/,"[\\1] ","g",$0)'}

空行を無視:
awk 'NF > 0 {print $1}'
awk '!/^$/ {print}'

区切り文字を指定:
awk -F'\t' '$2~/です/ {print sprintf("%06d %s", NR,$0)}'
awk -F, '{print NR,$3}'
awk -F' ' '{print $2}'
echo "A,1 B,2 C,3" | awk 'BEGIN{FS=",";RS=" ";OFS="\t"}{print$1,$2}'

数値の合計:
awk '{s+=$1}END{print s}'
awk 'BEGIN{print"NUM","SUM1","SUM2"}{s1+=$1;s2+=$2}END{print NR,s1,s2}'
awk 'BEGIN{OFMT="%.2f";print"NUM","VAL","CUM"}{s+=$1;print NR,$1,s}'

ラベルで集計:
echo "A 9\nB 2\nC 3\nA 5\nB 4" |\
awk '{s[$1]+=$2}END{for(k in s){print k" "s[k]}}'

標準偏差と偏差値:
echo "12\n67\n25\n37\n52\n40\n13\n29\n5\n93" |\
awk '{s+=$1;v[NR]=$1}END{a=s/NR;for(i in v){r+=(v[i]-a)^2};print sqrt(r/NR)}'

echo "12 67 25 37 52 40 13 29 5 93" |\
awk 'BEGIN{RS=" "}{s+=$1;v[NR]=$1}END{a=s/NR;
for(i in v){r+=(v[i]-a)**2};sd=sqrt(r/NR);
for(i=1;i<=NR;i++){print v[i],(v[i]-a)/sd*10+50}}'
(ref. 【Perl】標準偏差と偏差値の計算[2010-07-28-4])

辞書とマッチするカラムを置き換える:
cat a.dic
ABC 1
MNO 2
XYZ 3

cat a.txt
104 ABC this
780 MNO is
459 XYZ pen
482 ABC it

awk '!f{f=FILENAME}{if(f==FILENAME){d[$1]=$2}else
{if(d[$2]){print$1,d[$2],$3}else{print}}}' a.dic a.txt
104 1 this
780 2 is
459 3 pen
482 1 it
(ref. 【Perl】辞書とマッチするカラムを別なものに置換する【ワンライナー】[2015-09-01-4])

オプション・変数・関数


  • "-F" : 区切り文字を指定
  • $0 : 読み込んだ行の全体
  • NR : 行の数、行番号
  • NF : 列の数、フィールド数(カラム数)
  • FILENAME : 読み込んでるファイル名
  • RS : 入力の行区切り文字
  • FS : 入力の列区切り文字 ("-F"オプション)
  • ORS : 出力の行区切り文字
  • OFS : 出力の列区切り文字
  • OFMT : 数値の出力形式
  • BEGIN{}, END{} : 読み込み前と読み込み後に実行
  • cos, exp, getline, index, int, length, log, match, sin, split, sprintf, sqrt, substr
  • if, while, do, for, break, continue, print, printf, next, exit, delete

コメント


昔、「awk から多く学ぼう!」と言いながらいろいろやったけどそれほど多くは学べず、結局「大は小を兼ねる」で Perl を使ってる。Perl はテキスト・データ処理以外もできるし、柔軟性も汎用性も高い。

awk って、文字列置換まわりが sed 仕様だったら良かったんだけどねえ。って、それが Perl か。

参考


この記事に言及しているこのブログ内の記事

とらちゃん(息子5歳)がはまっているETVのテレビ番組「びじゅチューン!」。

  • びじゅチューン!
    http://www.nhk.or.jp/bijutsu/bijutune/
  • Wikipedia:びじゅチューン!
    世界の「びじゅつ」をユニークな歌とアニメーションで紹介する番組。毎回5分間の番組の中で、著名な美術作品をテーマにした1分半前後のオリジナルソングを放映している。このオリジナルソングは、作詞・作曲・アニメ・歌のすべてを映像作家の井上涼が制作している。

その DVD BOOK を買いました。予約注文してて4月ごろにアマゾンから届いたのですが、子供の誕生日に開けたので読んだのはつい最近。初版限定の直筆イラストは締め切りすぎてました……。

びじゅチューン! DVD BOOK

世界の有名な美術作品を題材にしたユニークなNHK番組「びじゅチューン! 」。
あの「モナ・リザ」が、「見返り美人図」が、「叫び」が、一度聞いたら耳から離れないうたと、あたたかいタッチのアニメーションになって、私たちのハートをわしづかみにします。
作詞、作曲、うた、アニメーション制作のすべてを手がけるのは、新進気鋭のアーティスト・井上涼。
その独特のセンスと世界観、番組のエッセンスをDVD1枚とBOOK1冊にギュッと詰め込みました。

BOOK は80ページ。元となった美術作品の解説、歌やアニメの着想メモや工夫や見所など。
  • 風神雷神図屏風デートの歌詞の「たらしこみの雲カー」の「たらしこみ」は絵を描くときの技法のことでした。ダブルミーニングな歌詞なのですねえ。
  • アニメーションの下絵はシャーペン手書きとのこと。スキャンしてアフターエフェクトで動画にするそう。

DVD ブックなのでもちろん DVD がついてます。今テレビにつなぐ DVD プレイヤーを片付けちゃってるので、引退状態の白マックブックを DVD プレイヤーとして使っています。歌だけ続けて再生できたりしてありがたいです。各回の解説もありますし、特典映像も楽しいです。

びじゅチューンDVD

収録作では「鳥獣戯画ジム」が一番好きです。ノリノリなのです。「委員長はヴィーナス」「風神雷神図屏風デート」も好き。うちの子は「ルソー5」が大好き。あと、個人的に気に入っている「兵馬俑ウエディング」は収録されていませんでした。新しいやつだし、この DVD BOOK の制作(企画?)中に放送され始めてたからかと。

歌の動画は公式ページにアーカイブされていますので、気になる人はぜひ見てみて!
http://www.nhk.or.jp/bijutsu/bijutune/

たつをの ChangeLog
Powered by chalow