web-dev-qa-db-ja.com

コピーして貼り付けた後にテキストファイルを揃える方法

ファイル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で発生することは言及する価値があります

2

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"

file1file2を入力ファイルに変更すると、出力は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]}
2
Raffa

厳密な配置が必要な場合は、明示的にフォーマットされた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
2
steeldriver