두 개의 파일이 있습니다. 첫 번째 파일에는 11개의 열이 있습니다. 예를 들면 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11
두 번째 항목에는 10개의 열이 있으며 다음과 같습니다.
11 22 33 44 55 66 77 88 99 100
내가 하고 싶은 일은 file1을 살펴보고 열 7이 14에서 15 사이의 값인 경우 file1의 열 9를 file2의 열 9 값으로 바꾸는 것입니다. 따라서 위의 예에서 file1은 다음과 같이 다시 작성됩니다.
1 2 3 4 5 6 7 8 99 10 11
열이 특정 값 사이에 있는지 확인하는 것은 간단합니다.
awk '$7 < 15 && $7 >= 14
그러나 file1의 열 9를 file2의 값으로 바꾸는 데 문제가 있습니다. file1은 단지 한 줄일 필요는 없습니다. 행 수에는 제한이 없으며 값이 14에서 15 사이인 모든 인스턴스에서 열 9를 바꿔야 합니다. 값이 14보다 작거나 15보다 크면 열은 그대로 유지되어야 합니다. 나는 이것이 어려울 것이라고 생각하지 않지만 운이 없었습니다. 어떤 도움이라도 대단히 감사하겠습니다. 미리 감사드립니다!
답변1
9번째 필드의 값을 사용하려면 1행만 사용하세요.file2
awk 'NR==1{a=$9}FNR==NR{next}14<=$7&&$7<15{$9=a}1' file2 file1
답변2
두 파일 의 라인 수가 동일하고 다른 파일의 해당 라인에만 관심이 있는 두 개의 개별 파일을 라인별로 처리합니다 awk
. 즉, file1의 라인 1과 file2 라인의 라인 1을 보려는 경우, 그런 다음 각 파일의 2번째 줄을 살펴보세요.
사용하시면 좋을 것 같아요paste file1 file2 | awk '{...}'
이는 file1의 각 행에 동일한 수의 필드가 있고 file2의 각 행에 동일한 수의 필드가 있는 경우 특히 그렇습니다(그러나 서로 동일한 수의 필드를 가질 필요는 없음).
필드 수가 가변적이므로 file1에서 가져온 필드와 file2에서 가져온 필드를 결정해야 하는 경우 paste
두 파일 모두에 표시되지 않을 명령에 대한 구분 기호를 지정한 다음 각 줄을 기준으로 분할 awk
할 수 있습니다. 이 구분 기호에. 예를 들어:
paste -d: file1 file2 | awk -F: '{NF1=split($1,file1," "); NF2=split($2,file2," "); if (file1[7] <= 15 && file1[7] >= 14) { file1[9] = file2[9] }; for (i=1; i<=NF1; i++) {printf file1[i] " "}; printf "\n";}'
이는 원하는 작업을 수행하지만 그 이상을 수행합니다. 및 의 행과 각 파일 에서 발견된 필드 수를 awk
모두 갖도록 변수를 설정합니다.file1
file2
NF1
NF2
getline
의 기능을 배울 시간이 있으면 awk
"getline()을 사용하여 이를 수행하는 방법"으로 이 답변을 업데이트하겠습니다. :)