행의 각 필드를 다른 파일의 열과 상호 참조

행의 각 필드를 다른 파일의 열과 상호 참조

저는 awk, sed, grep 등에 대한 경험이 없습니다. 내 질문을 표현하려고 하면 예상보다 더 혼란스러워 보이기 때문에 내가 달성하려는 내용의 예부터 시작하겠습니다.

input1

A B C D  
A B C  
A B C D E F  

input2

v A  
c B  
c C  
c D  
v E  

output

A B C D  
v c c c  
A B C  
v c c  
A B C D E F  
v c c c v Ø

기본적으로 2개의 입력 파일이 있습니다.

input1각 행에는 서로 다른 수의 필드가 있습니다.
input2각 행에는 2개의 필드가 있습니다.

output각 행의 위치가 필요합니다 . 먼저 전체 행과 모든 필드를 인쇄한 다음 다음 행의 input1경우 의 두 번째 필드에서 output해당 행의 각 필드 내용을 조회 합니다. 그런 다음 줄의 첫 번째 필드를 인쇄하거나 내용이 . 마지막 필드까지 이를 반복하여 결과를 한 줄에 인쇄합니다. 그런 다음 의 각 행에 대해 동일한 작업을 수행합니다.input1input2input2Øinput2input1

유사하지만 약간 다른 작업을 수행할 것이므로 명령의 각 부분이 수행하는 작업에 대한 간단한 설명을 주시면 감사하겠습니다. 미리 감사드립니다.

답변1

$ awk 'FNR == NR {   a[$2] = $1; next }
                 {   print
                     line = (a[$1] ? a[$1] : "Ø")
                     for (i = 2; i <= NF; ++i) {
                        line = line OFS (a[$i] ? a[$i] : "Ø")
                     }
                     printf("%s\n", line)
                 }' input2 input1
A B C D
v c c c
A B C
v c c
A B C D E F
v c c c v Ø

즉, 첫 번째 파일( )에서 읽으면 input2각 문자를 대체해야 하는 기호로 조회 테이블을 채웁니다.

두 번째 파일( input1)을 읽을 때 입력 줄을 출력한 다음 필드를 반복하고 조회 테이블의 올바른 기호를 사용하여 문자열을 구성합니다. 조회 테이블에서 기호가 누락된 경우 해당 기호를 삽입하십시오 Ø.

그런 다음 종료 개행 문자로 어셈블된 문자열을 출력합니다.


이를 적절한 스크립트로 변환할 수도 있습니다.

#!/usr/bin/awk -f

FNR == NR {   a[$2] = $1; next }
          {   print
              line = (a[$1] ? a[$1] : "Ø")
              for (i = 2; i <= NF; ++i) {
                  line = line OFS (a[$i] ? a[$i] : "Ø")
               }
                     printf("%s\n", line)
          }

그런 다음 실행 가능하게 만들고( chmod +x script) 다음과 같이 실행합니다.

$ ./script input2 input1
A B C D
v c c c
A B C
v c c
A B C D E F
v c c c v Ø

답변2

이것은 작동하는 것 같습니다:

awk 'NR==FNR { code[$2]=$1 } NR!=FNR {print; for( i=0; i<=NF; i++) { printf( "%s ", code[$i] ) }; printf "\n" }' input2 input1

NR==FNR블록은 지정된 첫 번째 파일(처리된 총 레코드 수가 현재까지의 총계와 동일함)에서만 실행되며 이후 출력에 사용되는 배열을 채웁니다.

NR!=FNR블록은 후속 파일에서만 실행되며, 먼저 주어진 입력 라인을 출력한 다음 이를 단계별로 실행하고 각 값을 배열 조회의 첨자로 사용하여 출력할지 여부를 결정 v합니다 c.

이 일련의 반복 후에 개행 문자가 출력됩니다.

관련 정보