
다음 코드를 실행합니다.두 파일의 두 번째 열 바꾸기( file2
및 file3
)는 파일의 12번째 열과 일치하며 source.dat
, 이에 따라 파일의 9번째 열이 source.dat
합계의 첫 번째 열과 일치해야 합니다.file2
file3
지금까지 나는 시도했다
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