awk를 사용하여 열 교체

awk를 사용하여 열 교체

다음 코드를 실행합니다.두 파일의 두 번째 열 바꾸기( file2file3)는 파일의 12번째 열과 일치하며 source.dat, 이에 따라 파일의 9번째 열이 source.dat합계의 첫 번째 열과 일치해야 합니다.file2file3

지금까지 나는 시도했다

for f in fil*; do 
    awk 'NR==FNR{ar[NR]=$12;next} {for (i=1;i<=length(ar);i++) if (FNR==i) $2=ar[i]}1' source.dat "$f" > temp
    awk '{printf("%.4f %12.8f     1.000     1    1\n", $1, $2)}' temp > "${f}_bvs"
done

from의 출력은 file2끝에 추가 행이 포함되어 있다는 점을 제외하면 정확합니다. 그러나 출력의 file3두 번째 열에는 다른 값이 포함되어 있습니다. 무슨 문제라도 있습니까?

  • 소스 파일
        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
    
  • 파일 3
    50093.5444   13.480     1.000     1    1
    50093.5506   14.830     1.000     1    1
    50093.5592   12.150     1.000     1    1
    50093.5662   12.150     1.000     1    1
    

전류 출력

  • 파일 2의 경우
    49667.8048   0.00006104     1.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     1.000     1    1
    49670.7279  -0.00326538     1.000     1    1
    49670.8197  -0.00598145     1.000     1    1
    49670.8945   0.00701904     1.000     1    1
    49671.7283  -0.00100708     1.000     1    1
    49671.7994  -0.00503540     1.000     1    1
    49671.8811   0.00000000     1.000     1    1
    0.0057   0.00000000     1.000     1    1
    
  • 파일 3의 경우
    50093.5444   0.00006104     1.000     1    1
    50093.5506   0.00546265     1.000     1    1
    50093.5592  -0.00497437     1.000     1    1
    50093.5662  -0.00357056     1.000     1    1
    

답변1

다음을 사용하여 이 작업을 수행할 수 있어야 합니다 join.

~$ join -1 1 -2 9 -o 1.1,2.12,1.3,1.4,1.5 file2 source.dat 
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
49670.7279 -0.00326538 1.000 1 1
49670.8197 -0.00598145 1.000 1 1
49670.8945 0.00701904 6.000 1 1
49671.7283 -0.00100708 1.000 1 1
49671.7994 -0.00503540 6.000 1 1
49671.8811 0.000000 1.000 1 1

~$ join -1 1 -2 9 -o 1.1,2.12,1.3,1.4,1.5 file3 source.dat
50093.5444 0.00570679 1.000 1 1
50093.5506 0.00424194 1.000 1 1
50093.5592 0.00100708 1.000 1 1
50093.5662 0.00372314 1.000 1 1

이는 각각 열 1과 9에 첫 번째 파일과 두 번째 파일( )이 join일치 file2(또는 )함을 표시 file3하고 첫 번째 파일의 첫 번째 열, 두 번째 파일의 열 12를 출력한 다음 나머지 열(원본 열 제외)을 출력합니다. ) 2) 첫 번째 파일부터 시작합니다.source.dat-1 1 -2 9

편집하다

후속 질문인 것 같습니다.이전 질문, 그리고 당신은 이것을 달성하기 위해 사용하고 싶습니다 awk. 이 경우에는 다음을 시도하십시오.

~$ awk 'FNR==NR{v[$9]=$12;next} {print $1,v[$1],$3,$4,$5}' source.dat file2 
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
49670.7279 -0.00326538 1.000 1 1
49670.8197 -0.00598145 1.000 1 1
49670.8945 0.00701904 6.000 1 1
49671.7283 -0.00100708 1.000 1 1
49671.7994 -0.00503540 6.000 1 1
49671.8811 0.000000 1.000 1 1

~$  awk 'FNR==NR{v[$9]=$12;next} {print $1,v[$1],$3,$4,$5}' source.dat file3
50093.5444 0.00570679 1.000 1 1
50093.5506 0.00424194 1.000 1 1
50093.5592 0.00100708 1.000 1 1
50093.5662 0.00372314 1.000 1 1

또는 루프에서

for f in file*; do awk 'FNR==NR{v[$9]=$12;next} {print $1,v[$1],$3,$4,$5}' source.dat "$f" > "${f}_bvs"; done

관련 정보