74000


下記のファイル(1つ目のファイル)の1列目に対して別ファイルの値(2つ目のファイルのFermi energy is 6.9266
evの6.9266)で引きたいのですがどうすればよろしいでしょうか。また、計算結果後の数値を１つ目のファイルに組み込みたいです。目的として1つ目のファイルの1列目(6.9266で引いた値)と3列目を用いたグラフを作成したいです。よろしくお願いいたします。

＊1つ目のファイル

[code]

    ＃　E (eV)   dos(E)     Int dos(E) EFermi =    6.927 eV
    -16.844  0.0000E+00  0.0000E+00
    -16.834  0.7721E+00  0.7376E-02
    -16.824  0.8280E+00  0.1538E-01
    -16.814  0.8844E+00  0.2394E-01
    -16.804  0.9412E+00  0.3306E-01
    -16.794  0.9986E+00  0.4276E-01
    ・
    ・(略)
    ・
    
[/code]

＊2つ目のファイル

[code]

    ・
    ・(略)
    ・
    -16.4186 -16.0081 -15.3148 -14.8071 -14.7569 -14.7353  -5.9508  -4.6087
    -3.7741  -2.8666  -2.5273  -2.3434  -0.6640  -0.5462   0.0910   0.1959
    0.4589   1.0149   1.1588   1.3790   1.5706   1.7128   2.0235   2.4136
    10.9011  11.9243  12.0415  12.5293  12.6880
    
    the Fermi energy is     6.9266 ev
    (compare with:     2.4949 eV, computed in scf)
    
    Writing output data file out_qa/qa.save/
    
    init_run     :      2.09s CPU      1.48s WALL (       1 calls)
    electrons    :    138.30s CPU     97.36s WALL (       1 calls)
    ・
    ・(略)
    
[/code]


CC BY-SA 4.0
2021-02-12T08:43:39.800
73952
2021-02-15T23:57:52.317
2021-02-12T09:00:01.397
3060
43931
question
c unix
複数ファイルから数値を抽出して計算したい


> 下記のファイル(1つ目のファイル)の1列目に対して別ファイルの値(2つ目のファイルのFermi energy is 6.9266
> evの6.9266)で引きたいのですがどうすればよろしいでしょうか。  
>
> また、計算結果後の数値を１つ目のファイルに組み込みたいです。目的として1つ目のファイルの1列目(6.9266で引いた値)と3列目を用いたグラフを作成したいです。よろしくお願いいたします。

シェルスクリプトでのコード例です。  
1つめのファイルをf1.txt、2つ目のファイルをf2.txtとします。

2つめのファイルのFermi energy is 6.9266 evの6.9266を抽出するにはsedを使っています。  
※条件に合致する行がひとつしかない前提です。複数ある場合はもう一工夫必要です。  
抜き出した数値は変数v1に格納しています。

1つめのファイルの処理にはawkを使っています。  
ファイルから1行ずつ読み込んで、＃を含まない行に対して、第1から第3列と「第2列-v1」を第4列として出力しています。

[code]

    v1=$(cat f2.txt | sed -n 's/^the Fermi energy is  *\([0-9\.][0-9\.]*\) ev.*/\1/p')
    awk '
    BEGIN {
        v = '${v1}'
    }
    !/＃/{
        printf("%s %s %s %s\n", $1, $2, $3, $2 - v)
    }
    ' f1.txt
    
[/code]

C言語で実装する場合も考え方は利用できると思います。

* * *

【追記】  
実行例です。  
q.shにコードを書いて、bashで実行しています。

[code]

    bash q.sh
    
[/code]

1つ目のファイル(f1.txt)

[code]

    ＃　E (eV)   dos(E)     Int dos(E) EFermi =    6.927 eV
    -16.844  0.0000E+00  0.0000E+00
    -16.834  0.7721E+00  0.7376E-02
    -16.824  0.8280E+00  0.1538E-01
    -16.814  0.8844E+00  0.2394E-01
    -16.804  0.9412E+00  0.3306E-01
    -16.794  0.9986E+00  0.4276E-01
    
[/code]

2つ目のファイル(f2.txt)

[code]

    -16.4186 -16.0081 -15.3148 -14.8071 -14.7569 -14.7353  -5.9508  -4.6087
    -3.7741  -2.8666  -2.5273  -2.3434  -0.6640  -0.5462   0.0910   0.1959
    0.4589   1.0149   1.1588   1.3790   1.5706   1.7128   2.0235   2.4136
    10.9011  11.9243  12.0415  12.5293  12.6880
    
    the Fermi energy is     6.9266 ev
    (compare with:     2.4949 eV, computed in scf)
    
    Writing output data file out_qa/qa.save/
    
    init_run     :      2.09s CPU      1.48s WALL (       1 calls)
    electrons    :    138.30s CPU     97.36s WALL (       1 calls)
    
[/code]

出力結果

[code]

    -16.844 0.0000E+00 0.0000E+00 -6.9266
    -16.834 0.7721E+00 0.7376E-02 -6.1545
    -16.824 0.8280E+00 0.1538E-01 -6.0986
    -16.814 0.8844E+00 0.2394E-01 -6.0422
    -16.804 0.9412E+00 0.3306E-01 -5.9854
    -16.794 0.9986E+00 0.4276E-01 -5.928
    
[/code]

GNU bash, バージョン 4.4.20(1)-release (x86_64-pc-linux-gnu)  
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 4.0.1, GNU MP 6.1.2)


CC BY-SA 4.0
2021-02-15T01:52:47.003
74000
2021-02-15T23:57:52.317
2021-02-15T23:57:52.317
35558
35558
73952
answer