ファイルがあります:
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"