

下記の内容が記されたファイルにて `2 2 2 1 1 1` (この値は変動する)の先頭3つ `2 2 2` について2倍 (計算結果 `4 4 4 1 1
1` ) したい。どう表現すれば良いでしょうか？

[code]

    &electrons
    /
    K_POINTS {automatic}
    2 2 2 1 1 1
    CELL_PARAMETERS {angstrom}
    4.255648834196731  -2.457000000000000   0.000000000000000 
    0.000000000000000   4.914000000000000   0.000000000000000 
    0.000000000000000   0.000000000000000   5.406000000000000 
    ATOMIC_SPECIES
    
[/code]

※ コメントの内容を反映

データを特定する条件は以下の通りです。

  1. `K_POINTS`を含む行の次の行を対象とする
  2. 対象となる行のスペースで区切られた6個の数値の内、最初の3個の数値を2倍にする

**変更前**

[code]

    K_POINTS {automatic}
    a a a b b b
    
[/code]

**変更後**

[code]

    K_POINTS {automatic}
    2*a 2*a 2*a b b b
    
[/code]

なお、上記のファイルは `SCF(Self-Consistent Field)`計算に用いる入力ファイルで、`K_POINTS` の書式は [Input
File Description: K_POINTS automatic](http://www.quantum-
espresso.org/Doc/INPUT_PW.html#idm1129) になります。


CC BY-SA 4.0
2021-02-17T21:39:52.867
74081
2021-02-20T01:47:35.030
2021-02-20T00:42:14.287
43931
question
awk
awkコマンドについて


スクリプト例です。  
K_POINTSを含む行をみつけたら、次の行を読み込み、最初の３個の数値を２倍して出力します。

[code]

    awk ' {
        if(match($0, /K_POINTS/) != 0){             #K_POINTSを含む行
            print $0
            getline                                 #次の行を対象
            num = split($0, a)
            dlmt = ""
            for(no = 1; no <= num; no++){
                if( no <= 3){                       #最初の3行が対象
                    printf("%s%d", dlmt, a[no]*2)   #値を2倍
                }
                else{
                    printf("%s%d", dlmt, a[no])
                }
                dlmt = " "  #区切り記号を空白
            }
            printf("\n")
        }
        else{
            print $0
        }
    }
    '
    
[/code]


CC BY-SA 4.0
2021-02-20T01:47:35.030
74147
2021-02-20T01:47:35.030
35558
74081
answer