2017-02-09 2 views
6

문자열을 awk으로 전달하면 패턴을 분할 한 후에 부분 문자열이 연관 배열의 색인이됩니다 (값이 아님).문자열을 직접 배열로 분할합니다.

과 같이 :

$ awk -v s="A:B:F:G" 'BEGIN{ # easy, but can these steps be combined? 
          split(s,temp,":") # temp[1]="A",temp[2]="B"... 
          for (e in temp) arr[temp[e]] #arr["A"], arr["B"]... 
          for (e in arr) print e 
          }' 
A 
B 
F 
G 

문자열 s 직접 해당 구성 요소가 arr에서 인덱스 항목을지고와 그 구성 요소로 분할 할 수 있도록 해주는 awkism 또는 gawkism이 있습니까?


이유는 (큰 사진) 나는이 (의사 AWK) 같은 것을 원하는입니다 :

awk -v s="1,4,55" 'BEGIN{[arr to arr["1"],arr["5"],arr["55"]} $3 in arr {action}' 

답변

3

아니,보다 배열 인덱스로 구분 된 문자열을 매핑하는 더 좋은 방법이 없습니다

awk -v s="1,4,55" 'BEGIN{split(s,tmp,/,/); for (i in tmp) arr[tmp[i]]} $3 in arr{action}' 

는 같은 동작을 얻을 수있는 또 다른 방법은 종류

awk -v s=",1,4,55," 'index(s,","$3","){action}' 
+1

나는'스플릿 (STR, TMP) 생각; for (i in tmp) arr [tmp [i]]'아마도 길이다. 감사! – dawg

+0

두번째 해법에서 * s *의 surroundig separator가 누락되는 것을 피하기 위해이 awk -vs = "A : B : C : G"s ~ "(^ | :)"$ 3 "(: | $)"{action } '' – NeronLeVelu

+1

@NeronLeVelu 그러면 정규식 비교로 바뀌므로 문자열의 정규 표현식 메타 문자에 대해 걱정할 필요가 있습니다. 원래 코드는 문자열 비교 ('$ 3 in arr')를 사용했고,'index() '를 사용하여 게시 한 코드도 regexp 메타 문자가 문자 그대로 취급 될 것입니다. –

1

아마 쓸모가 불필요하게 복잡하지만 나는 while, matchsubstr 경기를 열 수 있습니다 :

$ awk -v s="A:B:F:G" ' 
BEGIN { 
    while(match(s,/[^:]+/)) { 
     a[substr(s,RSTART,RLENGTH)] 
     s=substr(s,RSTART+RLENGTH) 
    } 
    for(i in a) 
     print i 
}' 
A 
B 
F 
G 

유용한 해결책이 있으면 열망합니다. 나는 asort s와 놀아 보았습니다. 당신이 당신의 최종 의사 코드가하는 일을 위해 그 접근 방식이 마음에 들지 않는다면

split(str,tmp); for (i in tmp) arr[tmp[i]] 

FWIW :

1

다른 방법입니다

고양이 파일

1 hi 
2 hello 
3 bonjour 
4 hola 
5 konichiwa 

실행을, 당신이 얻을

awk 'NR==FNR{d[$1]; next}$1 in d' RS="," <(echo "1,2,4") RS="\n" file 

,

1 hi 
2 hello 
4 hola 
관련 문제