다음 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
}
}