使用维护格式的其他文件中的列替换文件中的列

时间:2018-01-18 20:40:45

标签: bash awk

我有两个.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

我已经尝试了以下命令,但我得到的只是一团糟

awk 'FNR==NR{a[NR]=$0;next} {sub($4, a[FNR])}1' f1.dat f2.dat > final.dat

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

# Off---=0000           
# Angle=0000            
# Br    L1--    L2--    L3---
6   0.047   0.093   67.660
7   0.062   0.101   56.290
8   0.097   0.108   44.730
9   0.142   0.105   34.290
10  0.187   0.097   28.590
11  0.209   0.092   24.070
12  0.232   0.088   21.010
13  0.276   0.081   16.850
14  0.320   0.077   10.340
15  0.363   0.074   6.8600
16  0.385   0.073   5.2800
17  0.396   0.072   4.9800
18  0.407   0.071   4.6900
19  0.421   0.070   3.3000
20  0.428   0.070   2.1000
21  0.435   0.070   1.9100

我会非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

awk救援!

$ awk 'NR==FNR {a[NR]=$1;next} 
       FNR>3   {sub($NF"$",a[FNR-3])}1' file2 file1

# Off---=0.210
# Angle=-2.3
# Br    L1--    L2--    L3---
6     0.047   0.093   67.660
7     0.062   0.101   56.290
8     0.097   0.108   44.730
9     0.142   0.105   34.290
10    0.187   0.097   28.590
11    0.209   0.092   24.070
12    0.232   0.088   21.010
13    0.276   0.081   16.850
14    0.320   0.077   10.340
15    0.363   0.074   6.8600
16    0.385   0.073   5.2800
17    0.396   0.072   4.9800
18    0.407   0.071   4.6900
19    0.421   0.070   3.3000
20    0.428   0.070   2.1000
21    0.435   0.070   1.9100

请注意,您发布的预期输出不会保留格式。

答案 1 :(得分:0)

使用以下单行,您可以将4th文件的f1.dat列替换为f2.dat的内容:

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

使用getline,您可以将f2.dat文件的输入读入f2变量。然后按照所需顺序打印f1.dat和f2.dat中的字段,格式为printf

如果您想要替换不同的列,可以根据需要更改$1,$2,$3,f2的顺序并最终添加$4See here