배열을 분할하고 awk에 설정된 해시로 값을 보냅니다.

배열을 분할하고 awk에 설정된 해시로 값을 보냅니다.

쉘 스크립트에서 awk까지 var를 매개변수로 사용합니다.

awk -v var = "blah1|blah2|blah3" -f awk_script.awk

모든 쓰레기를 해시 세트에 넣어야하는데 현재 그렇게하고 있습니다. 나는 그것을 배열에 넣고 배열을 반복하여 해시 세트에 넣습니다.var를 배열로 먼저 구문 분석하는 대신 var를 가져와 변수를 해시 세트에 직접 넣는 것과 같이 더 나은 작업을 수행할 수 있습니까?

    split(var,arr,"|");
    for ( i = 1; i <= length(arr); i++ )
    {
            dest = arr[i];
            exclusion_destinations[dest];
    }

오프라인으로 확인해보겠습니다

if ( dest in exclusion_destinations )
{
// do something
}

답변1

한 번에 여러 배열 요소를 설정하는 유일한 구성은 함수입니다 split(적어도 표준 awk에서는 GNU awk에 다른 가능성이 있을 수 있습니다). 이는 숫자 인덱스에 할당됩니다. 따라서 연관 배열을 생성하려는 경우 루프에서 벗어날 수 없습니다.

그러나 배열을 사용하지 않도록 제외 테스트를 변경할 수 있습니다. 제외하려는 문자열에 정규식 특수 문자( ().?*+[]\^$)가 포함되어 있지 않은 경우 몇 가지만 조정하면 값을 var일치시키려는 정규식으로 처리할 수 있습니다. 이는 배열을 사용하는 것보다 약간 느릴 수 있지만 제외할 문자열이 많지 않는 한 크게 느리지는 않습니다.

BEGIN { exclude = "^(" var ")$" }
match(dest, exclude) { … }

또 다른 접근 방식은 var제외할 문자열을 연결하는 것으로 생각하는 것입니다. 사이에 이 있으면 dest제외됩니다. 이는 정규식 일치보다 속도가 느리지만 제외 목록이 충분히 큰 경우에만 측정 가능합니다.var|

BEGIN { exclude = "|" var "|" }
index(dest, exclude) { … }

답변2

나는 당신이 두 번째라고 생각합니다"오프라인"dest는 제외된 값과 비교하여 확인하는 값이 포함된 입력 파일에서 가져옵니다(예: 이 입력 파일을 "data"라고 부름).
제외된 값 목록은 다른 파일(예: "excludes"라고 함)을 통해 읽을 수 있습니다. 만약에들어오지 못하게 하다이미 으로 구분되어 있으므로 |sed를 사용하여 로 변경하면 됩니다 \n.

테스트 파일 생성

sed 's/ /\n/g' <<<"blah1 blah2 abcde" >data
sed 's/|/\n/g' <<<"blah1|blah2|blah3" >exclude

스크립트

awk '{
  if( NR==FNR ) { exclude[$0]++ 
  }else{ 

    # somewhere later on
    # "dest" to be tested is $1 of "data"
    if( exclude[$1] ) print "do something", $1 
  }
}' exclude data

또는 다음과 같이 두 개의 "파일"을 전달하는 것이 적합할 수 있습니다.

}' <(sed 's/|/\n/g' <<<"blah1|blah2|blah3") \
   data  

산출

do something blah1
do something blah2

관련 정보