さまざまなテキストを含む大容量ファイルがあります。ファイル全体を繰り返し、数値に所定の量(この場合はEXP = "XYZ"数値フィールドの2)を掛けるスクリプトを使用したいと思います。ただし、VIEW_RANGE、COOLEYE、およびTAMEBLEが前にある場合にのみこれを実行する必要があります。文書全体も完全に並んでいます。
はい
TAMEBLE="0" COOLEYE="20" VIEW_RANGE="9" EXP="12000"
TAMEBLE="0" COOLEYE="5" VIEW_RANGE="12" EXP="1000"
次のように見えます。
TAMEBLE="0" COOLEYE="20" VIEW_RANGE="9" EXP="24000"
TAMEBLE="0" COOLEYE="5" VIEW_RANGE="12" EXP="2000"
この目標をどのように達成できますか?
答え1
このテストファイルを考えてみましょう。
$ cat file
TAMEBLE="0" COOLEYE="20" VIEW_RANGE="9" EXP="12000" other stuff EXP="2" TAMEBLE="0" COOLEYE="5" VIEW_RANGE="12" EXP="1000"
TAMEBLE、COOLEYE、VIEW_RANGE の前に EXP 値を 2 倍にするには、次のようにします。
$ awk -F'[="]+' '$1=="TAMEBLE" {a[NR]=1} $1=="COOLEYE"{b[NR]=1} $1=="VIEW_RANGE" {c[NR]=1} $1=="EXP" && a[NR-3] && b[NR-2] && c[NR-1] {$0= $1 "=\"" (2*$2) "\""} END{printf"\n"} 1' RS=' ' ORS=' ' file
TAMEBLE="0" COOLEYE="20" VIEW_RANGE="9" EXP="24000" other stuff EXP="2" TAMEBLE="0" COOLEYE="5" VIEW_RANGE="12" EXP="2000"
または、コードを複数行に分散したい場合:
awk -F'[="]+' '
$1=="TAMEBLE" {
a[NR]=1
}
$1=="COOLEYE"{
b[NR]=1
}
$1=="VIEW_RANGE" {
c[NR]=1
}
$1=="EXP" && a[NR-3] && b[NR-2] && c[NR-1] {
$0= $1 "=\"" (2*$2) "\""
}
END{printf"\n"}
1
' RS=' ' ORS=' ' file
どのように動作しますか?
-F'[="]+'
これにより、フィールド区切り記号が
=
または組み合わせに設定されます"
。$1=="TAMEBLE" {a[NR]=1}
このレコードの最初のフィールドがTAMEBLEの場合は
a[NR]
trueに設定されます。ここで、はNR
レコード番号です。$1=="COOLEYE"{b[NR]=1}
同様に、レコードの最初のフィールドがCOOLEYEの場合は
b[NR]
trueに設定されます。$1=="VIEW_RANGE" {c[NR]=1}
同様に、レコードの最初のフィールドがVIEW_RANGEの場合、
c [NR] `をtrueに設定します。
$1=="EXP" && a[NR-3] && b[NR-2] && c[NR-1] {$0= $1 "=\"" (2*$2) "\""}
このレコードの最初のフィールドがあり、
EXP
前のレコードの最初のフィールドが必要な順序である場合、値は倍になりますEXP
。END{printf"\n"}
ファイルを読んだら、改行文字を印刷して行を正しく終了します。
1
これはprint-the-lineのawkの神秘的な速記です。
RS=' ' ORS=' '
これは awk に、入力と出力のレコード区切り文字としてスペースを処理するように指示します。