저는 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
해당 행의 각 필드 내용을 조회 합니다. 그런 다음 줄의 첫 번째 필드를 인쇄하거나 내용이 . 마지막 필드까지 이를 반복하여 결과를 한 줄에 인쇄합니다. 그런 다음 의 각 행에 대해 동일한 작업을 수행합니다.input1
input2
input2
Ø
input2
input1
유사하지만 약간 다른 작업을 수행할 것이므로 명령의 각 부분이 수행하는 작업에 대한 간단한 설명을 주시면 감사하겠습니다. 미리 감사드립니다.
답변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
.
이 일련의 반복 후에 개행 문자가 출력됩니다.