awk를 사용하여 동적 개수의 열이 포함된 맵 파일 처리

awk를 사용하여 동적 개수의 열이 포함된 맵 파일 처리

다음 정보를 어떻게 처리해야 하는지 알고 싶습니다.

mapping.txt:

80  001 002
81  011 012 013 014
82  021 022
...

input.txt:

81  103823044
80  103823054
81  103823064
...

예상하다 output.txt:

103823044|011|
103823044|012|
103823044|013|
103823044|014|
103823054|001|
103823054|002|
103823064|011|
103823064|012|
103823064|013|
103823064|014|

열 번호가 고정된 간단한 매핑을 수행했지만 동적 열 번호를 원하는 출력에 매핑하는 방법을 잘 모르겠습니다.

답변1

다음을 시도해 볼 수 있습니다.

awk 'NR == FNR { x[$1,$2] = $1; next; } { for (i in x) { if (x[i] == $1) { split(i,t,SUBSEP); for (z = 2; z <= NF; z++) { print t[2] "|" $z "|"; } } } }' input.txt mapping.txt

파일을 읽을 때 첫 번째 블록이 실행됩니다 input.txt. 이는 첫 번째 파일을 읽을 때의 조건을 통해 NR == FNR달성 됩니다. 첫 번째 블록에서는 첫 번째와 두 번째 열의 키와 첫 번째 열의 값으로 true배열을 만듭니다 . 첫 번째 블록에 있으므로 두 번째 블록이 파일에서 실행됩니다. 두 번째 블록에서는 첫 번째 열의 값이 배열의 값으로 존재하는지 배열의 각 키를 확인하고 , 그렇다면 키의 두 번째 부분을 추출한 다음 값의 값과 함께 루프에서 해당 값을 인쇄합니다. ​​두 번째 열부터 마지막 ​​열까지( -현재 레코드의 필드 수).xmapping.txtnextxxsplitNF

관련 정보