使用 awk 替换列

Ele*_*reg 2 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
Run Code Online (Sandbox Code Playgroud)

还有很多文件:

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
Run Code Online (Sandbox Code Playgroud)

如何用文件的最后一列替换许多文件中的第一列,使文件的第一列与许多文件的第二列相同。

示例中给出的小文件所需的结果是

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
Run Code Online (Sandbox Code Playgroud)

我试过:

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
Run Code Online (Sandbox Code Playgroud)

小文件的第一列消失而不是被替换。

cas*_*cas 5

您应该使用$1 = ar[$2],而不是ar[$1]。

此外,您不需要for循环,也不需要在 shell 中进行重定向。 awk可以自行构造文件名并重定向其输出。

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

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

输出:

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
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您可能应该使用不同的文件名前缀(或不同的输出目录),以便任何后续运行也不会重新处理small_file*_em文件。例如

mkdir new
Run Code Online (Sandbox Code Playgroud)

并将 awk 脚本中的打印语句更改为:

print > "new/" FILENAME "_em"
Run Code Online (Sandbox Code Playgroud)