내 명령이 잘못된 출력을 제공하는 이유는 무엇입니까?

내 명령이 잘못된 출력을 제공하는 이유는 무엇입니까?

열 1에 숫자 값이 있으면 행을 출력하려고 시도했지만 작동하지 않습니다. 내 예제 파일에는 열 1에 숫자가 없으므로 이 경우 awk는 아무것도 반환하지 않아야 합니까?

내 코드

awk -F 'BEGIN {OFS=FS}{ if ( ( $2 ~/aaa/ || $2 ~/bbb/ || $2~/ccc/) && $1 ~ "[[:digit:]]$")print}' file

고양이 파일

8F3FTO|aaa|278346|
TYF98|bbb|89237|
YUG198|ccc|29834|
aljs23456|ccc|241298|

내 코드가 반환됩니다.

aljs23456|ccc|241298

답변1

복사-붙여넣기 오류가 아니라면 실제로 |필드 구분 기호로 지정하지 않은 것입니다. 당신은 그것을 사용했어야 합니다 -F'|'.

또한 4개의 입력 행 모두 1열에 하나 이상의 숫자가 있습니다. 또한 열 1에는 숫자가 아닌 항목도 포함되어 있습니다. 숫자만 포함된 $1 행을 일치시키려면 를 사용하십시오 ^[[:digit:]]+$.

그건 그렇고, 스크립트에 수행할 수 있는 최적화가 많이 있습니다. 예를 들어

awk -F'|' 'BEGIN {OFS=FS}; $2 ~ /aaa|bbb|ccc/ && $1 ~ "^[[:digit:]]+$"' file

ifawk 문은 일반적으로 다음 형식을 취하므로 그럴 필요가 없습니다 pattern {action}(둘 다 선택 사항임). 패턴이 없는 연산은 모든 입력 라인에 대해 수행되고, 연산이 없는 연산은 print일치하는 모든 라인에 대해 수행됩니다( print 이는 패턴이 true로 평가될 때 기본 동작이므로 명령문은 1완전한 명령문이고 공통입니다. 관용어 동의어 {print}- "1"은 true로 평가되므로 print기본 작업을 수행합니다.

또는 $2에 대해 aaa, bbb 또는 ccc의 정확한 일치를 원하는 경우(예: aaab또는 와 같은 항목과 일치하지 않음 foocccbar):

awk -F'|' 'BEGIN {OFS=FS}; $2 ~ /^(aaa|bbb|ccc)$/ && $1 ~ "^[[:digit:]]+$"' file

관련 정보