awkを使用した熱交換

awkを使用した熱交換

ファイルがあります:

50102.5924   4.2599   4.2184  1.0098   4.2392
50103.5903   4.2895   4.2474  1.0099   4.2685
50107.5850   4.2100   4.2286  0.9956   4.2193
50108.5331   4.1477   4.1112  1.0089   4.1295
50108.7620   4.0770   4.1060  0.9929   4.0915
50109.5345   4.2227   4.2153  1.0018   4.2190
50109.7681   4.1677   4.1673  1.0001   4.1675
50110.5308   4.2333   4.3158  0.9809   4.2746
50110.7612   4.2339   4.2743  0.9905   4.2541
50111.5591   4.1330   4.1542  0.9949   4.1436
50112.5324   4.1417   4.0986  1.0105   4.1202
50112.7668   4.0075   3.9844  1.0058   3.9960
50113.5301   4.2147   4.2147  1.0000   4.2147
50113.7639   4.2263   4.2263  1.0000   4.2263
50114.5321   4.1205   4.1211  0.9999   4.1208

より多くのファイルがあります:

4.5149 50102.5924   72.220     1.000     1    1
4.5683 50103.5903   -3.800     1.000     1    1
4.4682 50107.5850  -23.670     1.000     1    1

ファイルの最初の列が多くのファイルの2番目の列と同じになるように、多くのファイルの最初の列をファイルの最後の列に置き換えるにはどうすればよいですか?

例に示されている小さなファイルの推定結果は次のとおりです。

4.2392 50102.5924   72.220     1.000     1    1
4.2685 50103.5903   -3.800     1.000     1    1
4.2193 50107.5850  -23.670     1.000     1    1

私は試した:

for f in small_file*; do 
    awk 'NR==FNR{ar[$1]=$5;next} ($2 in ar) {$1= ar[$1]}1'  her_OK "$f" > "${f}_em"
done

小さなファイルの最初の列は置き換えられずに消えます。

答え1

$1 = ar[$2]代わりに使用する必要がありますar[$1]

また、ループは必要なく、forシェルからリダイレクトする必要もありません。 awkファイル名を直接設定して出力をリダイレクトできます。

awk 'NR==FNR {
       ar[$1]=$5; next
     }

     ($2 in ar) {
       $1 = ar[$2];
       print > FILENAME "_em"
     }'  her_OK small_file*

出力:

4.2392 50102.5924 72.220 1.000 1 1
4.2685 50103.5903 -3.800 1.000 1 1
4.2193 50107.5850 -23.670 1.000 1 1

ただし、後続の実行でもファイルを再処理しないように、別のファイル名プレフィックス(または別の出力ディレクトリ)を使用する必要がありますsmall_file*_em。例えば

mkdir new

そして、awkスクリプトのprint文を次のように変更します。

print > "new/" FILENAME "_em"

関連情報