[string] 구분 된 문자열을 awk의 배열로 나누는 방법은 무엇입니까?

파이프 기호 |가 포함 된 문자열을 분할하는 방법 그것들을 배열로 나누고 싶습니다.

나는 시도했다

echo "12:23:11" | awk '{split($0,a,":"); print a[3] a[2] a[1]}'

어느 것이 잘 작동합니까? 내 문자열이 같다면 "12|23|11"어떻게 배열로 나눌 수 있습니까?



답변

시도해 보셨습니까?

echo "12|23|11" | awk '{split($0,a,"|"); print a[3],a[2],a[1]}'


답변

문자열을 배열로 나누려면 awk함수를 사용하십시오 split().

 awk '{split($0, a, ":")}'
 #           ^^  ^  ^^^
 #            |  |   |
 #       string  |   delimiter
 #               |
 #               array to store the pieces

구분 기호를 지정하지 않으면 FS공백이 기본값으로 사용 됩니다.

$ awk '{split($0, a); print a[2]}' <<< "a:b c:d e"
c:d

예를 들어 구분 기호를 제공 할 수 있습니다 :.

$ awk '{split($0, a, ":"); print a[2]}' <<< "a:b c:d e"
b c

다음을 통해 설정하는 것과 같습니다 FS.

$ awk -F: '{split($0, a); print a[1]}' <<< "a:b c:d e"
b c

gawk에서는 구분 기호를 정규 표현식으로 제공 할 수도 있습니다.

$ awk '{split($0, a, ":*"); print a[2]}' <<< "a:::b c::d e" #note multiple :
b c

그리고 네 번째 매개 변수를 사용하여 모든 단계에서 구분 기호가 무엇인지 확인하십시오.

$ awk '{split($0, a, ":*", sep); print a[2]; print sep[1]}' <<< "a:::b c::d e"
b c
:::

GNU awkman 페이지를 인용 해 봅시다 :

split (문자열, 배열 [, fieldsep [, seps]])

문자열fieldsep 로 구분 된 조각으로 나누고 조각을 배열에 저장 하고 구분자 문자열을 seps 배열에 저장합니다. 첫번째 조각에 저장되고 array[1], 두 번째 부분 array[2]등등과. 제 인수 문자열 값 fieldsep는 분할 위치를 설명하는 정규 표현식 인 문자열 (만큼 FS가 입력 레코드를 분할하는 위치를 설명하는 정규식 될 수있다). 경우 fieldsep은 생략 값 FS가 사용된다. split()작성된 요소 수를 반환합니다. sepsgawk확장이며, seps[i]사이에 구분자 문자열이 있습니다.array[i]그리고 array[i+1]. 경우 fieldsep은 단일 공간은 다음 선행 공백이 들어가는 seps[0]내로 진행 공백 후행는 seps[n]여기서 N 의 리턴 값 split()(즉, 배열의 요소 수).


답변

좀 더 구체적으로 말씀해주세요! “작동하지 않는다”는 무슨 뜻입니까? 정확한 출력 (또는 오류 메시지), OS 및 awk 버전을 게시하십시오.

% awk -F\| '{
  for (i = 0; ++i <= NF;)
    print i, $i
  }' <<<'12|23|11'
1 12
2 23
3 11

또는 split을 사용하십시오.

% awk '{
  n = split($0, t, "|")
  for (i = 0; ++i <= n;)
    print i, t[i]
  }' <<<'12|23|11'
1 12
2 23
3 11

편집 : Solaris 에서는 4000 필드를 올바르게 처리 하려면 POSIX awk ( / usr / xpg4 / bin / awk )를 사용해야 합니다.


답변

echo "..." | awk ...불필요 fork하고 exec시스템 호출을 호출하므로 솔루션이 마음에 들지 않습니다 .

약간의 왜곡으로 Dimitre의 솔루션을 선호합니다.

awk -F\| '{print $3 $2 $1}' <<<'12|23|11'

또는 조금 더 짧은 버전 :

awk -F\| '$0=$3 $2 $1' <<<'12|23|11'

이 경우 출력 레코드가 합쳐진 실제 조건이므로 인쇄됩니다.

이 특정한 경우에 stdin리디렉션은 내부 변수 :

awk -v T='12|23|11' 'BEGIN{split(T,a,"|");print a[3] a[2] a[1]}'

나는 사용했다 꽤 오래되었지만 내부 문자열 조작으로 관리 할 수 ​​있습니다. 첫 번째 경우 원래 문자열은 내부 터미네이터로 분할됩니다. 두 번째 경우 문자열에는 항상 하나의 문자 구분 기호로 구분 된 숫자 쌍이 포함되어 있다고 가정합니다.

T='12|23|11';echo -n ${T##*|};T=${T%|*};echo ${T#*|}${T%|*}
T='12|23|11';echo ${T:6}${T:3:2}${T:0:2}

모든 경우의 결과는

112312


답변

실제로 awk‘Input Field Separator Variable’ 링크 라는 기능이 있습니다. 이것을 사용하는 방법입니다. 실제로 배열은 아니지만 내부 $ 변수를 사용합니다. 간단한 문자열을 나누는 것이 더 쉽습니다.

echo "12|23|11" | awk 'BEGIN {FS="|";} { print $1, $2, $3 }'


답변

echo "12|23|11" | awk '{split($0,a,"|"); print a[3] a[2] a[1]}'

작동해야합니다.


답변

echo "12|23|11" | awk '{split($0,a,"|"); print a[3] a[2] a[1]}'