조건에 따라 파일의 열에 대한 빈 레코드 수를 계산하려고 합니다. 하지만 여건이 좋지 않습니다.
- 입력 예: 고정 너비 파일,
761128424607/22/20197611284246CAD052020DHH 0073578EKLAVY3
ELEKBAFXXL7900271761128424406/22/20197611284244CAD042020DKA 0038244EDITTU8
761128424606/22/20197611284246CAD052020DHH 0073578EKLAVY3
ELEKBAFXXL7900271761128424406/22/20197611284244CAD042020DKA 0038244EDITTU8
- 암호
RE='[[:space:]]{17}' awk -v m=1 -v p=17 -v r='&& substr($0,28,2)==06' $'BEGIN{re = ENVIRON["RE"]}{c = substr($0,m,p)} c ~ "^(" re ")$" r {N++} END {print N+0}' < input_file.txt
- 원하는 출력:
1
, 파일의 레코드 2개가 비어 있고 레코드 1개가 조건을 만족하기 때문입니다.substr($0,28,2)==06
- 실제 출력:
0
, 이는 잘못된 것입니다.
답변1
이것은 쉘 변수의 내용을 해석하기 위해 호출되기 전에 awk 스크립트의 일부로 확장함으로써 r
요구하는 작업을 수행 하지만 실제로 원하는 작업을 수행하는 더 나은 방법이 거의 확실합니다 awk
.
$ r='&& substr($0,28,2)=="06"'
$ RE='[[:space:]]{17}' awk -v m=1 -v p=17 '
BEGIN { re = ENVIRON["RE"] }
{ c = substr($0,m,p) }
c ~ "^(" re ")$" '"$r"' { N++ }
END { print N+0 }
' file
1
어딘가에 작성 해야 한다면 && substr($0,28,2)=="06"
쉘 변수 대신 awk 스크립트로 작성하지 않는 이유가 전혀 명확하지 않습니다. 원하는 것이 무엇이든 더 나은 방법이 있어야 합니다.
답변2
awk ... r='&& substr($0,28,2)==06'
'... c ~ "^(" re ")$" r { ... } '
조건을 동적으로 작성하기 위해 awk 변수를 사용하려는 것 같습니까? 즉, awk 변수의 내용이 r
awk 구문의 일부로 사용됩니다.
나는 이것이 작동하지 않을 것이라고 생각합니다. awk에서 연속된 값은 문자열 연결로 처리되므로 정규 표현식의 일부로 일치 c ~ "^(" re ")$&& substr($0,28,2)==06"
하는 것과 같은 것이 됩니다.r
예를 들어, 변수에 등이 포함되어 있어도 awk -v var=bar '$0 ~ "foo" var'
포함된 줄이 인쇄됩니다 . 비슷하게 작동합니다.foobar
&&
아마도 다른 프로그래밍 언어에서는 작동하지 않을 것입니다. 왜냐하면 코드와 데이터 사이의 분리는 온전하고 안전한 프로그래밍을 위한 요구 사항이기 때문입니다. 이것은 쉘에서도 작동하지 않습니다. (그와 같은 일은 없다 eval
.)
전체 표현을 전체적으로 작성해 보세요.
답변3
몇 가지만 변경하면 예상한 결과를 출력할 수 있습니다.
RE='[^[:space:]]' awk -v m=1 -v p=17 \
$'(r=substr($0,28,2)=="06")&&
(substr($0,m,p) !~ re) {N++}
BEGIN {re = ENVIRON["RE"]}
END {print N+0}' < input_file.txt
편집하다:-
- 명령줄에 선언된 awk 변수 r을
$'...'
코드 블록으로 변환합니다. - 을 제거
&&
하고 부울로 변환하십시오. - 및 부울 조건 사이를 유지합니다
&&
.c ~ ...
r
==06
숫자 비교를 문자열 비교로 변경=="06"
답변4
GNU를 사용하면 변수를 사용하여 고정 너비 필드의 너비를 지정할 awk
수 있습니다 .FIELDWIDTHS
gawk '($1!~/[^ ]/) && ($3=="06"){++c} END{print c+0}' FIELDWIDTHS='17 10 2 *' file
매개변수화된 awk 스크립트를 사용해 볼 수 있습니다. 시도해 볼 수 있는 몇 가지 사항은 다음과 같습니다.
str=06 gawk -v FIELDWIDTHS='17 10 2 *' '
($1 !~ /[^ ]/) && ($3"" == ENVIRON["str"]) {
++c
}
END {print c+0}
' file
str=06 rexp='^ {17}$' gawk -v FIELDWIDTHS='17 10 2 *' -v rexp_col=1 -v str_col=3 '
($rexp_col ~ ENVIRON["rexp"]) && ($str_col"" == ENVIRON["str"]) {
++c
}
END {print c+0}
' file