복사하여 붙여넣은 후 텍스트 파일의 열 정렬 문제를 해결하는 방법은 무엇입니까?

복사하여 붙여넣은 후 텍스트 파일의 열 정렬 문제를 해결하는 방법은 무엇입니까?

파일 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

하지만 아직 두 가지 질문이 있습니다.

첫 번째 문제는 출력 파일의 열이 원본 파일(파일 1 및 파일 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개의 데이터 필드가 있다는 것입니다 file2. C3 9999 형식이 잘못된 필드이거나 두 필드 의 합 C410000이어야 합니다 .C410000

필드 수에 따라 형식을 조정하려면 다음을 수행하십시오.

  • 두 개의 형식 문자열 사용 및 둘 사이 전환
  • 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"

산출:

 ...
 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
 ...

관련 정보