おぼえがき

おぼえがき

sed 読み込んだファイルの内容を置換する

2007-02-27 | sed awk
テンプレートにスタイルシートの宣言がXXXXXXって入ってて、
それを削除した上に、3行変わりにYYYYって言うファイルの中に
入っているスタイルシートの行を追加したい。




for i in $(ls -1 該当テンプレートファイル);
do
 sed -i '/XXXXXX/ {    #XXXXXX にマッチしている行を抽出
 r YYYYY         #YYYYYからファイルを読み込む
 /.*XXXXXX.*$/d      #XXXXXXの行は、削除
}' $i;
done

できる。

ちょっと感動。

awk システム変数を理解(FS OFS RS ORS NF NR FILENAME)

2007-02-23 | sed awk
awk 'BEGIN {FS="n"; RS="ORS="-"} {print $1,$NF}' aaaa

ファイルの中身
-----------------
1
2
3

4
5
6

7
8
9
-----------------

以下のスクリプトの実行

ファイルの1から3 4から6 7から8をひとつのデータとして考える

awk '
 BEGIN {
  FS="n";      # カラムの区切りを改行に
  RS="";       # レコードの区切りを空白に(ファイルの3と4の間)
  OFS="*";      # 出力のデミリタ(カンマがあればOFSに変わる $1,$NFの部分)
  ORS="nn"     # 出力のデミリタ(改行二つが1回ごとの実行のデミリタとなる)
 }

 {
  print NR"." $1,$NF # NR:現在の行 / NF:1レコードの最大カラムの位置
 }

 END {
  print FILENAME   # FILENAME : ファイル名の出力
 }' ファイル名


-----------------
結果

1.1*3

2.4*6

3.7*9

ファイル名
-----------------

awk 変数(パラメータ)の渡し方

2007-02-23 | sed awk
awk 'BEGIN {print AA}' AA="XYZ"
ってやっても、

XYZ

を出力してくれない。

これは、awkの制約で、最初の入力行が読み込まれた後でなければ、
コマンドラインパラメータには、アクセスできないため。

つまり、BEGINの中では、アクセスできない・・・


だけど、


-v オプションを使えば、そうでもなくなるわけで、

awk -v AA='XYZ' 'BEGIN {print AA}'

ってやると、XYZが出力される。

-vオプションは、スクリプトの前に書くこと。

これで、これも納得できる。


awk match関数を使わんでも・・・

2007-02-22 | sed awk
awk 'BEGIN{FS="[:|_]"} $2 ~ /Error/ {print $3}' ${ファイル名}


match関数を使わんでも。
$2 ~ /Error/
といった、マッチができる。
ちなみに、これの否定版は

$2 !~ /Error/

でできる。


あと、

デミリタに

awk -F ":" ....

ってやってたけど、

FS="正規表現" がかける。

便利。