awk 정규식 일치 표현식으로 명령줄 인수를 사용하는 방법은 무엇입니까?

awk 정규식 일치 표현식으로 명령줄 인수를 사용하는 방법은 무엇입니까?

다음 awk 스크립트가 있습니다.

#!/bin/awk -f

BEGIN {
    FS  = "";
}

value ~ "MYVALUE" # silly test
{
    print "1 - " substr($0, 235, 12);
}

$235 ~ "M" {
    print "2 - " substr($0, 235, 12);
}

{
    if(value == substr($0, 235, 12))
    {
        print "3 - " substr($0, 235, 12);
    }
    if(match(value,substr($0, 235, 12)))
    {
        print "4 - " substr($0, 235, 12);
    }
}

END {
    print "exit"
}

나는 그것을 다음과 같이 실행합니다 :./script.awk -v value="MYVALUE" my_file

이것은 내 RHEL 5.5 awk입니다.

$ ls -l  $(which awk)
lrwxrwxrwx 1 root root 4 Jul 10  2015 /bin/awk -> gawk
$ gawk --version
GNU Awk 3.1.5

1과 2가 작동합니다. 그런데 2에 다음과 같은 개행 문자를 넣으면 다음과 같습니다 {.

$235 ~ "M" 
{
    print "2 - " substr($0, 235, 12);
}

그러면 출력은 단지 인쇄된 것이 아니라 완전히 일치하는 라인입니다.

내가 하고 싶은 것은 value정규식을 사용하여 일치시키는 것이지만 항상 실패합니다. 그것은 다음과 같습니다:

$235...$247 ~ value

나는 예를 보았다 ([1831722][유닉스/27410])는 단일 문자와 일치하지만 표현식과는 일치하지 않습니다.

편집하다

명확성을 위해 awk에 전달된 명령줄 인수를 사용하고 이를 줄에 대한 다중 문자 오프셋으로 사용하여 필드 구분 기호 없이 줄을 일치시키고 싶습니다. 나는 Python을 해킹했습니다.

#!/usr/bin/python

import re

t   = 'ABC'
rg  = '^.{235,235}' + t
rgx = re.compile(rg)
tt  = '00000ABC00'
if(rgx.match(tt)):
    print "OK"
else:
    print "KO"

이 사용 사례에 대해서만 문제의 파일이 상당히 크기 때문에 awk가 더 빠를 것입니다.

답변1

나는 이것이 약간 오래되었다는 것을 알고 있지만 다른 사람이 여기에 오면 몇 가지 의견을 추가하겠다고 생각했습니다. 먼저 일련의 필드를 생성하려면 필드를 로 구분합니다 ,.

$235, $247 ~ value { ... action here ... }

원하는 경우 이 함수의 출력을 직접 사용하여 substr일치 항목을 찾을 수도 있습니다.

substr($0, 235, 12) ~ value { ... action here ... }

그리고 당신도 발견한 것 같군요.일부교정장치의 개수가 중요합니다. 각 일치에 대해 작업 쌍, 일치 또는 작업은 암시적 기본값(모두 일치 또는 $0 인쇄)이 될 수 있으므로 변경하세요.

$235 ~ "M" {  print "2 - " substr($0, 235, 12);  }

도착하다

$235 ~ "M" 
{  print "2 - " substr($0, 235, 12);  }

의미를 에서 로 print this substring only when field 235 is an M변경 합니다 whenever field 235 is an M print the whole record, AND for every record, print the substring. 예를 들어 각 레코드의 하위 문자열에 대해 여러 검사를 수행해야 하는 경우 이 방법을 사용할 수 있으며 첫 번째 작업은 다음과 같습니다.

BEGIN { FS="" }
# oursubstr will be updated first for each record.
{ oursubstr = substr($0, 235, 12) } 
oursubstr ~ value { ... action ... }
...

답변2

이것은 작동하는 것 같습니다.

{
    if(substr($0, 235, 12) ~ value)
    {
        print "4 - " substr($0, 235, 12)
        next
    }
    else
    {
        print "4 - NOK"
        next
    }
}

관련 정보