다른 열과 일치하는 파일의 열을 바꾸는 방법

다른 열과 일치하는 파일의 열을 바꾸는 방법

두 개의 파일이 있습니다. 파일 1의 열 9가 파일 2의 열 1과 동일하도록 파일 2의 열 2를 파일 1의 열 12로 바꾸려면 어떻게 해야 합니까?

파일 1

    1 2000 11 11  7  9 45  840                         49667.8048  18.33  HeI  6.10352e-05
    2 2000 11 11  8 56 57  660                         49667.8782  18.15  HeI   0.00546265
    3 1994 11 12  5 18 10 1020                         49668.7284  18.34  HeI  -0.00497437
    4 1994 11 12  7 35 30  840                         49668.8227  18.14  HeI  -0.00357056
    5 1994 11 12  9  6 42  720                         49668.8854  17.99  HeI  -0.00476074
    6 1994 11 14  5 20 43  600                         49670.7279  18.04  HeI  -0.00326538
    7 1994 11 14  7 32 46  630                         49670.8197  17.84  HeI  -0.00598145
    8 3000 11 14  9 21 14  540                         49670.8945  17.66  HeI   0.00701904
    9 1994 11 15  5 21 14  610                         49671.7283  17.88  HeI  -0.00100708
   10 4445 11 15  7  4  5  540                         49671.7994  17.73  HeI  -0.00503540
   11 1994 11 15  9  1 14  600                         49671.8811  17.53  HeI     0.000000
   12 1996  1 11  0 56  4  301                         50093.5444   2.26  HeI   0.00570679
   13 1996  1 11  1  2 30  601                         50093.5506   2.25  HeI   0.00424194
   14 1996  1 11  1 15 23  541                         50093.5592   2.23  HeI   0.00100708
   15 1996  1 11  1 26 29  420                         50093.5662   2.22  HeI   0.00372314

파일 2

49667.8048   78.450     3.000     1    1
49667.8782   79.900     1.000     1    1
49668.7284   40.890     1.000     1    1
49668.8227   45.790     1.000     1    1
49668.8854   49.770     5.000     1    1
49670.7279   66.060     1.000     1    1
49670.8197   47.380     1.000     1    1
49670.8945   27.270     6.000     1    1
49671.7283   66.190     1.000     1    1
49671.7994   65.320     6.000     1    1
49671.8811   62.290     1.000     1    1

원하는 결과:

49667.8048   6.10352e-05     3.000     1    1
49667.8782   0.00546265      1.000     1    1
49668.7284   -0.00497437     1.000     1    1
49668.8227   -0.00357056     1.000     1    1
49668.8854   -0.00476074     5.000     1    1
......

나는 다음과 같은 것을 시도했습니다

awk 'NR==FNR{ar[$9]=$0;next}($1 in ar){print ar[$9],$0}' file1 file2

답변1

사용 gawk:

$ awk 'NR==FNR{ar[$9]=$12;next}
($1 in ar) {$2= ar[$1]}1'  file1 file2

이 명령에서는 NR==FNR{ar[NR]=$12;next}규칙이 첫 번째 파일에 적용된다는 의미입니다.오직FNRfile1 이후에는 0으로 설정되기 때문입니다 . 이 규칙에서는 ar첫 번째 파일의 필드 9( )에 색인된 필드 12의 내용을 사용하여 배열이 생성됩니다. 추가 조치가 취해지는 것을 방지합니다.$9file1nextfile1

이 표현식은 if ($1 in ar) $2=ar[$1]첫 번째 필드( $1)가 다음에서 발견되는지 여부를 의미합니다.색인그런 다음 ar두 번째 필드 file2ar. 이는 ar첫 번째 파일의 $9에 인덱스가 생성되기 때문입니다 file1. 이제 변경되었으므로 새 $2것이 인쇄됩니다 .file21$0

1is awk에 대한 관용구를 인쇄합니다 .

답변2

파일이 정렬되었으므로 다음을 사용하여 이 작업을 수행할 수 있습니다 join.

join file1 file2 -1 9 -2 1 -o 2.1,1.12,2.3,2.4,2.5

설명하다:

  • -1두 파일은 file1(옵션)의 열 #9와 -2file2(옵션)의 열 #1 에서 연결됩니다.
  • 출력( -o) 옵션은 필드 2.1(파일 2의 열 1), 1.12(파일 1의 열 12) 등으로 구성됩니다.

관련 정보