複数の数値フィールドスクリプト

複数の数値フィールドスクリプト

さまざまなテキストを含む大容量ファイルがあります。ファイル全体を繰り返し、数値に所定の量(この場合は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 に、入力と出力のレコード区切り文字としてスペースを処理するように指示します。

関連情報