将文件中的任何列替换为维护格式的其他文件中的列

时间:2018-01-18 22:35:55

标签: bash shell

我有两个.dat文件,f1.dat和f2.dat如下所示。我试图将列从f2.dat文件复制到f1.dat文件,同时使用shell脚本命令保留f1.dat的格式。

文件1(f1.dat)

# Off---=0.210
# Angle=-2.3
# Br    L1--    L2--    L3---
6     0.047   0.093   44.660
7     0.062   0.101   43.290
8     0.097   0.108   36.730
9     0.142   0.105   28.290
10    0.187   0.097   21.590
11    0.209   0.092   19.070
12    0.232   0.088   17.010
13    0.276   0.081   13.850
14    0.320   0.077   11.340
15    0.363   0.074   9.8600
16    0.385   0.073   9.2800
17    0.396   0.072   8.9800
18    0.407   0.071   8.6900
19    0.421   0.070   8.3000
20    0.428   0.070   8.1000
21    0.435   0.070   7.9100

文件2(f2.dat)

67.660
56.290
44.730
34.290
28.590
24.070
21.010
16.850
10.340
6.8600
5.2800
4.9800
4.6900
3.3000
2.1000
1.9100

我想用文件f2.dat中的列替换f1.dat中的第三列。 f1.dat的输出必须如下;

    # Off---=0.210
# Angle=-2.3
# Br    L1--    L2--    L3---
6     0.047   67.66   44.660
7     0.062   56.29   43.290
8     0.097   44.73   36.730
9     0.142   34.29   28.290
10    0.187   28.59   21.590
11    0.209   24.07   19.070
12    0.232   21.01   17.010
13    0.276   16.85   13.850
14    0.320   10.34   11.340
15    0.363   6.860   9.8600
16    0.385   5.280   9.2800
17    0.396   4.980   8.9800
18    0.407   4.690   8.6900
19    0.421   3.300   8.3000
20    0.428   2.100   8.1000
21    0.435   1.910   7.9100

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这个单线程解决了您的问题:

带标题

awk '{ if (NR > 3) { getline f2 < "f2.dat"; print $1 FS $2 FS f2 FS $4 } else print $0 }' f1.dat

或( 格式良好

awk '{ if (NR > 3) { getline f2 < "f2.dat"; printf "%-5d %8.3f %8.3f %8.4f\n",$1,$2,f2,$4 } else print $0 }' f1.dat

没有标题

awk 'NR > 3 { getline f2 < "f2.dat"; print $1 FS $2 FS f2 FS $4 }' f1.dat

您可以使用getlinef2.dat文件中的输入读入f2变量。然后按照所需顺序打印f1.datf2.dat中的字段,这些字段由预定义字段分隔符FS分隔,或使用printf格式良好。 Awk开始在f2.dat的第3行之后读取f1.dat文件。