다음을 포함하는 문자열 tstArr2가 있습니다.
'3 5 8'
이제 awk에서 플랫 파일을 구문 분석하고 싶습니다.
test my array which array is better array
INDIA USA SA NZ AUS ARG GER BRA
US AUS INDIA ENG NZ SRI PAK WI BAN NED IRE
이 번호가 매겨진 열에만 있습니다. 나는 다음을 시도했다
awk -vA="$tstArr2" 'BEGIN{split(A,B," ");} {if(NR>1){for(i=1; i<= length(B); i++){printf "%s ",B[i]}}print " "}' testUnix3.txt
하지만 그것은 말한다
awk: Cannot read the value of B. It is an array name.
The input line number is 2. The file is testUnix3.txt.
The source line number is 1.
내가 무엇을 놓치고 있나요? 다음을 시도하면
awk -vA="$tstArr2" 'BEGIN{split(A,B," ");} {if(NR>1){for(i in B){printf "%s ",$B[i]}}print " "}' testUnix3.txt
출력을 인쇄하지만 순서대로 인쇄되지 않습니다. 나는 그들이 순서대로 있기를 바랍니다. 설명 해주십시오. 원하는 출력:
SA AUS BRA
INDIA NZ WI
답변1
POSIX 정의길이in은 awk
매개변수를 문자열로 포함하는 문자열 함수입니다. 배열을 인수로 사용하는 것은 length
지정되지 않은 동작입니다.
일부 awk
유사한 구현 에서는gawk (버전 >= 3.1.6),AWK의 OS X 버전, 배열을 인수로 사용할 수 length
있으며 배열의 요소 수를 반환합니다.
의 배열은 awk
연관 배열이며 연관 배열을 통한 반복은 순서를 보장하지 않습니다. 이 경우 다음을 사용할 수 있습니다.나뉘다배열의 요소 수를 가져오기 위해 필드 수를 반환하는 함수입니다.
POSIXly에서는 다음을 시도해 볼 수 있습니다.
$ awk -vA="$tstArr2" '
BEGIN{n = split(A,B," ");}
{
if(NR > 1) {
for(i = 1;i <= n;i++) {
printf "%s ",$B[i];
}
}
print " ";
}
' file
SA AUS BRA
INDIA NZ WI
답변2
(GNU가 아닌 awk의 경우 @cuonglm의 답변을 참조하세요.)
이것을 테스트 파일로 사용하십시오:
$ cat testUnix3.txt
test my array which array is better array
INDIA USA SA NZ AUS ARG GER BRA
US AUS INDIA ENG NZ SRI PAK WI BAN NED IRE
이 코드는 열 3, 5, 8을 선택합니다.
$ tstArr2='3 5 8'
$ awk -vA="$tstArr2" 'BEGIN{split(A,B," ");} NR>1{for(i=1; i<= length(B); i++) printf "%s ",$B[i]; print "";}' testUnix3.txt
SA AUS BRA
INDIA NZ WI
위의 내용은 GNU를 사용하여 테스트되었습니다 awk
.
awk
루프와 시퀀스
awk
연관 배열이 있습니다. ~처럼그레이모어 awk 튜토리얼 설명하다:
특히 연관 배열을 사용할 때 작은 문제가 있습니다.~을 위한각 요소에 대한 출력 명령: 출력 순서를 제어할 수 없습니다.
for(i in B)
이것이 루프를 사용하는 인용한 다른 코드가 때때로 순서가 잘못된 열을 인쇄할 수 있는 이유입니다.
GNU awk에는 이 문제를 해결하기 위한 확장 기능이 있습니다:
$ gawk -vA="$tstArr2" 'BEGIN{split(A,B," "); PROCINFO["sorted_in"]="@ind_num_asc"} {if(NR>1){for(i in B){printf "%s ",$B[i]}print " "}}' testUnix3.txt
SA AUS BRA
INDIA NZ WI
을 설정하면 PROCINFO["sorted_in"]="@ind_num_asc"
인덱스가 숫자 오름차순으로 순환됩니다. 이 GNU 확장은 문서화되어 있습니다.여기.
답변3
awk
이러한 간단한 작업에 이러한 강력한 도구를 사용하는 데에는 상당한 오버헤드가 있습니다.
tstArr2='3,5,8'
tail -n+2 testUnix3.txt | cut -d' ' -f"$tstArr2"