コピーして貼り付けた後、テキストファイルの列の並べ替えの問題を解決する方法は?

コピーして貼り付けた後、テキストファイルの列の並べ替えの問題を解決する方法は?

ファイル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 in vacuum

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

ファイル2:

GRM in vacuum

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

ファイル3(出力):

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

並べ替えの問題を解決するには、次のものを使用しました。

    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

しかし、まだ2つの質問があります。

最初の問題は、出力ファイルの列が元のファイル(ファイル1およびファイル2)とは異なるようにソートされていることです。

第2の問題は、ライン10002で発生する。列 2 と 3 が一緒にマージされ、ライン 10002 から最後までの列全体が出力ファイルから消えます。以下は、10002行の3つのファイルです。

ファイル1:

2500GRM     C3 9999  15.716   8.242   0.002  0.2372 -0.2989 -0.0758   # line 10001
2500GRM     C410000  15.592   8.311   0.003  0.2603 -0.2492 -0.2394   # line 10002
2501GRM     C110001  15.591   8.453   0.006  0.0887 -0.2458 -0.7014   # line 10003
2501GRM     C210002  15.714   8.524   0.007 -0.0788  0.0598 -0.9619   # line 10004

ファイル2:

2500GRM     C3 9999  15.433   8.378   0.000   # line 10001
2500GRM     C410000  15.310   8.449   0.000   # line 10002
2501GRM     C110001  15.310   8.591   0.000   # line 10003
2501GRM     C210002  15.433   8.662   0.000   # line 10004

ファイル3:

2500GRM C3 9999 15.433 8.378 0.000 0.2372 -0.2989 -0.0758   # line 10001
2500GRM C410000 15.310 8.449 0.000  -0.2492 -0.2394         # line 10002
2501GRM C110001 15.310 8.591 0.000  -0.2458 -0.7014         # line 10003
2501GRM C210002 15.433 8.662 0.000  0.0598 -0.9619          # line 10004

次のリンクにすべてのファイルを添付しました。

https://drive.google.com/drive/folders/13diMVxlp-T9BXE_jnm_LL1jUPbz8eren

答え1

問題は、8〜9個のデータフィールドがあり、file15〜6個のデータフィールドがあることですfile2C3 9999 型が無効なフィールドであるか、2つのフィールドの合計でC410000なければなりません。C410000

フィールド数に基づいて書式を調整するには、次の手順を実行します。

  • 2 つの書式文字列の使用と 2 つの切り替え
  • n行を分割して最後の3つの値を取得するときに、配列要素の数を保存します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"

出力:

 ...
 2500GRM     C3 9999  15.433   8.378   0.000  0.2372 -0.2989 -0.0758
 2500GRM     C410000  15.310   8.449   0.000  0.2603 -0.2492 -0.2394
 2501GRM     C110001  15.310   8.591   0.000  0.0887 -0.2458 -0.7014
 2501GRM     C210002  15.433   8.662   0.000 -0.0788  0.0598 -0.9619
 ...

関連情報