使用 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

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

示例中给出的小文件的期望结果是

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,也不需要在 shell 中进行重定向。 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"

相关内容