파이프 기호 |
가 포함 된 문자열을 분할하는 방법 그것들을 배열로 나누고 싶습니다.
나는 시도했다
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
:::
split (문자열, 배열 [, fieldsep [, seps]])
문자열 을 fieldsep 로 구분 된 조각으로 나누고 조각을 배열에 저장 하고 구분자 문자열을 seps 배열에 저장합니다. 첫번째 조각에 저장되고
array[1]
, 두 번째 부분array[2]
등등과. 제 인수 문자열 값 fieldsep는 분할 위치를 설명하는 정규 표현식 인 문자열 (만큼 FS가 입력 레코드를 분할하는 위치를 설명하는 정규식 될 수있다). 경우 fieldsep은 생략 값 FS가 사용된다.split()
작성된 요소 수를 반환합니다. seps 는gawk
확장이며,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
리디렉션은어 wk 내부 변수 :
awk -v T='12|23|11' 'BEGIN{split(T,a,"|");print a[3] a[2] a[1]}'
나는 사용했다 ksh 꽤 오래되었지만 세게 때리다내부 문자열 조작으로 관리 할 수 있습니다. 첫 번째 경우 원래 문자열은 내부 터미네이터로 분할됩니다. 두 번째 경우 문자열에는 항상 하나의 문자 구분 기호로 구분 된 숫자 쌍이 포함되어 있다고 가정합니다.
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]}'