![내 명령이 잘못된 출력을 제공하는 이유는 무엇입니까?](https://linux55.com/image/207264/%EB%82%B4%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EC%9E%98%EB%AA%BB%EB%90%9C%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EC%A0%9C%EA%B3%B5%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
열 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
if
awk 문은 일반적으로 다음 형식을 취하므로 그럴 필요가 없습니다 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