土曜日, 6月 03, 2006

忘れやすい sed と awk 書式

【sed】

文字列パターンは//で囲む
$ sed '/gid/!s/ss04/tokyo04/' sample

行数は範囲を数字で書く。コンマで区切ると範囲指定
$ sed '2d' sample
$ sed '2,3d' sample

パターンと組み合わせることも可。
$ sed -n '1,/home/p' file

1行目以降「home」という文字列が最初に現れる行までを削除する場合
$ sed '1,/home/d' sample

yで指定すると対応する各文字間での置換
sed 'y/abc/xyz/' file
具体的にいうと、「a」→「x」/「b」→「y」/「c」→「z」となる。 文字数が違うとエラーになる。


【awk】

文字列パターンは、基本的にA~/B/か、A=="B"という形式をとる
$1 ~ /稚内/{print $0}

BEGIN、ENDの書式
awk ' BEGIN { print "データ表示" }
      { print "データ=",$0 }
   END  { print "これでおわり" }' summer.data

平均を求めたりする場合
awk ' { s = s + $2 }
END { print "合計:", s, "平均:", s/NR }' file4

第1フィールドにファイル名が書いてあるとして、第2フィールドをそのファイルに出力。
このとき「$1」の前後を「"」で括る必要はなし。

awk '{print $2 > $1}' data2

パイプの先にはコマンド使用可能。コマンドも「"」で括る必要があり。
awk '{print $0 "sort -nr +1"}' data2

system関数を使用することでUNIXのコマンドを使用可。使用するコマンドは「"」で括る。
$ awk '{print $1,$2 > "fruits" ; system("wc -l fruits")}' data2

次の行の読み込み
awk '{printf"%s->",$0 ; getline ; print $0}' kana

読み込んだ次の行を変数に入れる場合の書き方
$ awk '{printf"%s->",$0;getline x; print x}' kana