我将文件 1 中的第 7、8 和 9 列复制到文件 2 中的第 7、8 和 9 列,从而生成一个新文件 3。生成的文件(文件 3)与原始文件不对齐,我该如何编辑它以保持对齐?
我使用以下命令:
awk '(getline line < "file 1") > -1 {split(line,a); $7 = a[7]; $8 = a[8]; $9= a[9]} 1' file 2 > file 3
文件 1:
真空中的 GRM
192700
1GRM C1 1 17.188 0.311 13.994 -0.5971 0.0204 -0.0724
1GRM C2 2 0.094 0.383 0.005 0.4831 -0.8709 -0.2204
1GRM C3 3 0.091 0.524 0.008 -0.7098 0.3449 -0.3952
1GRM C4 4 17.185 0.596 0.007 -0.4066 -0.4079 0.1701
2GRM C1 5 17.187 0.738 0.016 0.1844 -0.5441 -0.4893
2GRM C2 6 0.090 0.815 0.011 1.1631 -0.2289 -0.8340
2GRM C3 7 0.091 0.957 0.014 -0.4473 -0.2423 -0.3223
2GRM C4 8 17.184 1.028 0.009 -0.4822 0.0086 -0.4791
3GRM C1 9 17.189 1.171 0.004 -0.0345 -0.8207 -0.6602
文件2:
真空中的 GRM
192760
1GRM C1 1 0.061 0.071 14.000
1GRM C2 2 0.184 0.142 14.000
1GRM C3 3 0.184 0.284 0.000
1GRM C4 4 0.061 0.355 0.000
2GRM C1 5 0.061 0.497 14.000
2GRM C2 6 0.184 0.568 0.000
2GRM C3 7 0.184 0.710 0.000
2GRM C4 8 0.061 0.781 0.000
3GRM C1 9 0.061 0.923 0.000
3GRM C2 10 0.184 0.994 14.000
3GRM C3 11 0.184 1.136 14.000
3GRM C4 12 0.061 1.207 14.000
4GRM C1 13 0.061 1.349 14.000
4GRM C2 14 0.184 1.420 14.000
4GRM C3 15 0.184 1.562 0.000
4GRM C4 16 0.061 1.633 14.000
5GRM C1 17 0.061 1.775 0.000
5GRM C2 18 0.184 1.846 0.002
5GRM C3 19 0.184 1.988 0.001
5GRM C4 20 0.061 2.059 0.000
文件 3:
真空中的 GRM
192760
1GRM C1 1 0.061 0.071 14.000 -0.5971 0.0204 -0.0724
1GRM C2 2 0.184 0.142 14.000 0.4831 -0.8709 -0.2204
1GRM C3 3 0.184 0.284 0.000 -0.7098 0.3449 -0.3952
1GRM C4 4 0.061 0.355 0.000 -0.4066 -0.4079 0.1701
2GRM C1 5 0.061 0.497 14.000 0.1844 -0.5441 -0.4893
2GRM C2 6 0.184 0.568 0.000 1.1631 -0.2289 -0.8340
2GRM C3 7 0.184 0.710 0.000 -0.4473 -0.2423 -0.3223
2GRM C4 8 0.061 0.781 0.000 -0.4822 0.0086 -0.4791
3GRM C1 9 0.061 0.923 0.000 -0.0345 -0.8207 -0.6602
3GRM C2 10 0.184 0.994 14.000 0.1033 0.4238 -0.8983
3GRM C3 11 0.184 1.136 14.000 -0.0426 -0.1083 -0.8554
3GRM C4 12 0.061 1.207 14.000 -0.2814 -0.0363 -0.9146
4GRM C1 13 0.061 1.349 14.000 0.7722 0.4317 -0.4379
4GRM C2 14 0.184 1.420 14.000 -0.5701 0.2915 -0.3098
4GRM C3 15 0.184 1.562 0.000 0.4572 0.1368 0.1921
4GRM C4 16 0.061 1.633 14.000 -0.0747 -0.5492 -0.1254
5GRM C1 17 0.061 1.775 0.000 0.3071 0.9864 -0.8679
5GRM C2 18 0.184 1.846 0.002 -0.7815 -0.8144 -0.0069
5GRM C3 19 0.184 1.988 0.001 -0.0089 0.1174 0.2548
5GRM C4 20 0.061 2.059 0.000 0.7953 0.1404 -1.1225
6GRM C1 21 0.061 2.201 14.000 -0.0370 0.1705 -0.3342
6GRM C2 22 0.184 2.272 14.000 -0.2619 0.4221 -0.6572
6GRM C3 23 0.184 2.414 14.000 -0.4540 -0.3948 -0.6204
6GRM C4 24 0.061 2.485 14.000 -0.1499 -0.2942 -0.5181
我想要的格式与文件 1 和 2 的格式相同(列之间有空格)
我按照 schrodigerscatcuriosity 和 steeldriver 的建议尝试了以下命令,但是从第 10002 行到末尾仍然存在问题,请检查下面我尝试的命令和输出:
awk '(getline line < "file_1") > -1 {split(line,a); $7 = a[7]; $8 = a[8]; $9= a[9]} 1' file_2 | rev | column -t | rev > file_3
awk 'BEGIN{fmt="%8s%7s%5d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"} (getline line < "file 1") > -1 {n = split(line,a)} n > 6 {$0 = sprintf(fmt,$1,$2,$3,$4,$5,$6,a[7],a[8],a[9])} 1' "file 2" > file 3
他们俩都给了我以下内容:
2499GRM C2 9994 15.433 7.810 0.001 0.2740 -0.1307 0.2597
2499GRM C3 9995 15.433 7.952 0.000 -0.0604 -0.1317 0.2130
2499GRM C4 9996 15.310 8.023 0.001 -0.0362 -0.0640 -0.3092
2500GRM C1 9997 15.310 8.165 0.001 -0.0183 -0.0765 -0.0458
2500GRM C2 9998 15.433 8.236 0.000 -0.2414 0.3310 0.3241
2500GRM C3 9999 15.433 8.378 0.000 -0.2669 0.3179 0.8367
2500GRMC410000 15 8.449 0.000 0.000 0.5860 0.8426 0.0000 #(This line is 10002)
2501GRMC110001 15 8.591 0.000 0.000 0.5939 -0.1623 0.0000
2501GRMC210002 15 8.662 0.000 0.000 0.4561 -0.1660 0.0000
我尝试使用增加空间
awk 'BEGIN{fmt="%10s%9s%7d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"} (getline line < "file 1") > -1 {n = split(line,a)} n > 6 {$0 = sprintf(fmt,$1,$2,$3,$4,$5,$6,a[7],a[8],a[9])} 1' "file 2" > file 3
按照建议,我得到了以下输出:
2499GRM C3 9995 15.433 7.952 0.000 -0.0604 -0.1317 0.2130
2499GRM C4 9996 15.310 8.023 0.001 -0.0362 -0.0640 -0.3092
2500GRM C1 9997 15.310 8.165 0.001 -0.0183 -0.0765 -0.0458
2500GRM C2 9998 15.433 8.236 0.000 -0.2414 0.3310 0.3241
2500GRM C3 9999 15.433 8.378 0.000 -0.2669 0.3179 0.8367
2500GRM C410000 15 8.449 0.000 0.000 0.5860 0.8426 0.0000 # (This line is 10002)
2501GRM C110001 15 8.591 0.000 0.000 0.5939 -0.1623 0.0000
2501GRM C210002 15 8.662 0.000 0.000 0.4561 -0.1660 0.0000
2501GRM C310003 15 8.804 0.000 0.000 0.4524 -0.1486 0.0000
2501GRM C410004 15 8.875 0.000 0.000 -0.2143 0.4926 0.0000
2502GRM C110005 15 9.017 0.000 0.000 -0.2203 0.2975 0.0000
2502GRM C210006 15 9.088 0.000 0.000 -0.2375 -0.0458 0.0000
2502GRM C310007 15 9.230 14.000 0.000 -0.2338 -0.4862 0.0000
2502GRM C410008 15 9.301 14.000 0.000 -0.1438 -0.0725 0.0000
原始文件的同一部分(第 10002 行)如下所示:
文件 1:
2499GRM C3 9995 15.167 8.231 13.994 -0.0604 -0.1317 0.2130
2499GRM C4 9996 15.045 8.304 13.996 -0.0362 -0.0640 -0.3092
2500GRM C1 9997 15.046 8.446 0.001 -0.0183 -0.0765 -0.0458
2500GRM C2 9998 15.170 8.516 13.999 -0.2414 0.3310 0.3241
2500GRM C3 9999 15.172 8.658 0.003 -0.2669 0.3179 0.8367
2500GRM C410000 15.049 8.727 0.006 -0.1138 0.5860 0.8426 #(line 10002)
2501GRM C110001 15.048 8.869 0.006 -0.0660 0.5939 -0.1623
2501GRM C210002 15.171 8.940 0.006 0.0179 0.4561 -0.1660
2501GRM C310003 15.173 9.082 0.005 0.3025 0.4524 -0.1486
文件2:
2499GRM C3 9995 15.433 7.952 0.000
2499GRM C4 9996 15.310 8.023 0.001
2500GRM C1 9997 15.310 8.165 0.001
2500GRM C2 9998 15.433 8.236 0.000
2500GRM C3 9999 15.433 8.378 0.000
2500GRM C410000 15.310 8.449 0.000 #(This line is 10002)
2501GRM C110001 15.310 8.591 0.000
2501GRM C210002 15.433 8.662 0.000
2501GRM C310003 15.433 8.804 0.000
2501GRM C410004 15.310 8.875 0.000
值得一提的是,问题发生在第 10002 行
答案1
你可以尝试这个技巧:
awk '(getline line < "file_1") > -1 {split(line,a); $7 = a[7]; $8 = a[8]; $9= a[9]} 1' file_2 | rev | column -t | rev > file_3
输出:
1GRM C1 1 0.061 0.071 14.000 -0.5971 0.0204 -0.0724
1GRM C2 2 0.184 0.142 14.000 0.4831 -0.8709 -0.2204
1GRM C3 3 0.184 0.284 0.000 -0.7098 0.3449 -0.3952
1GRM C4 4 0.061 0.355 0.000 -0.4066 -0.4079 0.1701
2GRM C1 5 0.061 0.497 14.000 0.1844 -0.5441 -0.4893
2GRM C2 6 0.184 0.568 0.000 1.1631 -0.2289 -0.8340
2GRM C3 7 0.184 0.710 0.000 -0.4473 -0.2423 -0.3223
2GRM C4 8 0.061 0.781 0.000 -0.4822 0.0086 -0.4791
3GRM C1 9 0.061 0.923 0.000 -0.0345 -0.8207 -0.6602
3GRM C2 10 0.184 0.994 14.000 -0.0345 -0.8207 -0.6602
3GRM C3 11 0.184 1.136 14.000 -0.0345 -0.8207 -0.6602
3GRM C4 12 0.061 1.207 14.000 -0.0345 -0.8207 -0.6602
4GRM C1 13 0.061 1.349 14.000 -0.0345 -0.8207 -0.6602
4GRM C2 14 0.184 1.420 14.000 -0.0345 -0.8207 -0.6602
4GRM C3 15 0.184 1.562 0.000 -0.0345 -0.8207 -0.6602
4GRM C4 16 0.061 1.633 14.000 -0.0345 -0.8207 -0.6602
5GRM C1 17 0.061 1.775 0.000 -0.0345 -0.8207 -0.6602
5GRM C2 18 0.184 1.846 0.002 -0.0345 -0.8207 -0.6602
5GRM C3 19 0.184 1.988 0.001 -0.0345 -0.8207 -0.6602
5GRM C4 20 0.061 2.059 0.000 -0.0345 -0.8207 -0.6602
答案2
如果您需要严格对齐,您可能需要考虑使用明确格式化printf
或sprintf
语句例如。
$ awk '
BEGIN{fmt="%8s%7s%5d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"}
(getline line < "file 1") > -1 {n = split(line,a)}
n > 6 {$0 = sprintf(fmt, $1,$2,$3,$4,$5,$6,a[7],a[8],a[9])}
1
' "file 2"
GRM in vacuum
192760
1GRM C1 1 0.061 0.071 14.000 -0.5971 0.0204 -0.0724
1GRM C2 2 0.184 0.142 14.000 0.4831 -0.8709 -0.2204
1GRM C3 3 0.184 0.284 0.000 -0.7098 0.3449 -0.3952
1GRM C4 4 0.061 0.355 0.000 -0.4066 -0.4079 0.1701
2GRM C1 5 0.061 0.497 14.000 0.1844 -0.5441 -0.4893
2GRM C2 6 0.184 0.568 0.000 1.1631 -0.2289 -0.8340
2GRM C3 7 0.184 0.710 0.000 -0.4473 -0.2423 -0.3223
2GRM C4 8 0.061 0.781 0.000 -0.4822 0.0086 -0.4791
3GRM C1 9 0.061 0.923 0.000 -0.0345 -0.8207 -0.6602
3GRM C2 10 0.184 0.994 14.000 -0.0345 -0.8207 -0.6602
3GRM C3 11 0.184 1.136 14.000 -0.0345 -0.8207 -0.6602
3GRM C4 12 0.061 1.207 14.000 -0.0345 -0.8207 -0.6602
4GRM C1 13 0.061 1.349 14.000 -0.0345 -0.8207 -0.6602
4GRM C2 14 0.184 1.420 14.000 -0.0345 -0.8207 -0.6602
4GRM C3 15 0.184 1.562 0.000 -0.0345 -0.8207 -0.6602
4GRM C4 16 0.061 1.633 14.000 -0.0345 -0.8207 -0.6602
5GRM C1 17 0.061 1.775 0.000 -0.0345 -0.8207 -0.6602
5GRM C2 18 0.184 1.846 0.002 -0.0345 -0.8207 -0.6602
5GRM C3 19 0.184 1.988 0.001 -0.0345 -0.8207 -0.6602
5GRM C4 20 0.061 2.059 0.000 -0.0345 -0.8207 -0.6602
答案3
试试这个(为了便于阅读,将一个命令分成四行,只需一次覆盖所有四行,然后粘贴到终端,然后按Enter),看看它是否适合你:
awk '(getline line < "file1") > -1 {split(line,a); l=length($2); \
if (l>2) {$2=substr($2,1,2) OFS substr($2,3)}; \
if (l>2) {$7 = a[6]; $8 = a[7]; $9= a[8]} else \
{$7 = a[7]; $8 = a[8]; $9= a[9]}}1' "file2" | column -t > "file3"
将file1
和更改file2
为您的输入文件,输出将保存到file3
注意:
您的列数在第 10002 行发生变化(第 2 列和第 3 列变为一列),并且命令的以下部分修复了此问题:
l=length($2); \
if (l>2) {$2=substr($2,1,2) OFS substr($2,3)}; \
if (l>2) {$7 = a[6]; $8 = a[7]; $9= a[8]} else \
{$7 = a[7]; $8 = a[8]; $9= a[9]}
答案4
Freddy 在 Stack Exchange - Unix & Linux 中回答了这个问题。我发布这个答案只是为了防止其他人遇到同样的问题。
问题是文件 1 中有 8 或 9 个数据字段,而文件 2 中有 5 或 6 个数据字段。C3 9999 是一个格式错误的字段,或者 C410000 应该是两个字段 C4 和 10000。
要根据字段数量调整格式,您可以
使用两个格式字符串并在它们之间切换保存数组元素的数量 n 当您拆分行并取最后三个值 a[n-2], a[n-1], a[n]
awk '
BEGIN{
fmt1="%8s %6s%5s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS
fmt2="%8s %11s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS
}
(getline line < "file 1") > -1{
n=split(line, a)
}
NF<=3{ print; next } #
print original line
NF==6{ printf fmt1, $1, $2, $3, $4, $5, $6, a[n-2], a[n-1], a[n]; next } # 6 +
3 fields
{ printf fmt2, $1, $2, $3, $4, $5, a[n-2], a[n-1], a[n] } # 5 +
3 fields
' "file 2" > "file 3"