ファイル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で発生することは言及する価値があります
steeldriver および schrodigerscatcuriosity によるすでに2つの素晴らしい答えに加えて
これを試してください(読みやすくするために4行に分割された1つのコマンドです。4行すべてを一度にキャプして、ターミナルに貼り付けて押してください。 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が1列になります)、コマンドの次の部分でこの問題が修正されます。
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]}
厳密な配置が必要な場合は、明示的にフォーマットされた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