awk에서 배열의 길이를 어떻게 얻을 수 있습니까?
이 명령
echo "hello world" | awk '{split($0, array, " ")} END{print length(array) }'
나를 위해 작동하지 않으며이 오류 메시지를 제공합니다.
awk : 1 행 : 배열 배열에 대한 잘못된 참조
왜?
배열을 분할하면 요소 수가 반환되므로 다음과 같이 말할 수 있습니다.
echo "hello world" | awk '{n=split($0, array, " ")} END{print n }'
# ------------------------^^^--------------------------------^^
출력은 다음과 같습니다.
2
Ventimiglia의 기능은 작업을 수행하기 위해 약간의 조정이 필요합니다 (문의 세미콜론 참조).
function alen(a, i) {
for(i in a);
return i
}
그러나 모든 경우 또는 시간을 작동하지 마십시오. 그 이유는 awk가 배열의 인덱스를 저장하고 "보는"방식 때문입니다. 그것들은 연관성이 있고 반드시 연속적이지 않습니다 (C처럼). 따라서 i
"마지막"요소를 반환하지 않습니다.
이를 해결하려면 다음을 계산해야합니다.
function alen(a, i, k) {
k = 0
for(i in a) k++
return k
}
그리고 이러한 방식으로 "단 차원"배열의 다른 인덱스 유형에주의하십시오. 여기서 인덱스는 문자열 일 수 있습니다. 참조 : http://docstore.mik.ua/orelly/unix/sedawk/ch08_04.htm . "다차원"및 임의 배열에 대해서는 http://www.gnu.org/software/gawk/manual/html_node/Walking-Arrays.html#Walking-Arrays를 참조 하십시오 .
나는 그 사람이 "어떻게 문자열을 분할하고 결과 배열의 길이를 얻는가?"라고 묻지 않는다고 생각합니다. 그들이 제공하는 명령은 그것이 발생한 상황의 예일 뿐이라고 생각합니다. 특히, 나는 그 사람이 1) 왜 length (array)가 오류를 유발하는지, 2) awk에서 배열의 길이를 어떻게 얻을 수 있는가?
첫 번째 질문에 대한 대답은 길이 함수가 POSIX 표준 awk의 배열에서 작동하지 않는다는 것입니다. GNU awk (gawk)와 몇 가지 다른 변형에서는 작동합니다. 두 번째 질문에 대한 대답은 (모든 awk 변형에서 작동하는 솔루션을 원한다면) 선형 스캔을 수행하는 것입니다.
예를 들어 다음과 같은 함수가 있습니다.
function alen (a, i) {
for (i in a);
return i;}
참고 : 두 번째 매개 변수 i는 몇 가지 설명을 보증합니다.
awk에서 지역 변수를 도입하는 방법은 추가 함수 매개 변수이며 관례는 이러한 매개 변수 앞에 추가 공백을 추가하여이를 표시하는 것입니다. 이것은 여기 GNU Awk 매뉴얼에서 논의 됩니다 .
다음을 지적하고 싶습니다.
split
인쇄하기 위해 함수 의 결과를 저장할 필요가 없습니다 .- If separator is not supplied for the split, the default
FS
(blank space) will be used. The
END
part is useless here.echo 'hello world' | awk '{print split($0, a)}'
In gawk
you can use the function length()
:
$ gawk 'BEGIN{a[1]=1; a[2]=2; a[23]=45; print length(a)}'
3
$ gawk 'BEGIN{a[1]=1; a[2]=2; print length(a); a[23]=45; print length(a)}'
2
3
From The GNU Awk user's guide:
With gawk and several other awk implementations, when given an array argument, the
length()
function returns the number of elements in the array. (c.e.) This is less useful than it might seem at first, as the array is not guaranteed to be indexed from one to the number of elements in it. If --lint is provided on the command line (see Options), gawk warns that passing an array argument is not portable. If --posix is supplied, using an array argument is a fatal error (see Arrays).
sample on MacOSX Lion to show used ports (output can be 192.168.111.130.49704 or ::1.49704) :
netstat -a -n -p tcp | awk '/\.[0-9]+ / {n=split($4,a,"."); print a[n]}'
In this sample, that print the last array item of 4th column : "49704"
echo "hello world" | awk '{lng=split($0, array, " ")} END{print lng) }'
Try this if you are not using gawk.
awk 'BEGIN{test="aaa bbb ccc";a=split(test, ff, " "); print ff[1]; print a; print ff[a]}'
Output:
aaa
3
ccc
8.4.4 Using split() to Create Arrays http://docstore.mik.ua/orelly/unix/sedawk/ch08_04.htm
ReferenceURL : https://stackoverflow.com/questions/9351902/how-can-i-get-the-length-of-an-array-in-awk
'IT Share you' 카테고리의 다른 글
Rails 콘솔에서 이메일 보내기 (0) | 2021.01.09 |
---|---|
목록에서 최대 값 가져 오기 (0) | 2021.01.09 |
Python, OpenCV에서 슬라이싱을 사용하여 이미지에서 영역 추출 (0) | 2021.01.09 |
Netbeans 7.4에서 Derby 데이터베이스를 시작할 수 없습니다. (0) | 2021.01.09 |
시작시 배치 파일 실행 (0) | 2021.01.09 |