awk와 grep의 다른 결과

awk와 grep의 다른 결과

결과는 124입니다.

awk 'BEGIN {FS = ","; count = 0}; { if ($7 ~ /Nature Life/) { count++ }} END   {print count}' file.csv

결과는 123입니다.

grep -cE '^([^,]*,){6}[^,]*Nature Life' file.csv

파일이 너무 커서 읽을 수 없습니다.

어떤 제안이 있으십니까?

답변1

불일치를 발견하려면 awk는 포착했지만 grep은 포착하지 못한 줄이 다음과 같이 표시되어야 합니다.

awk 'BEGIN{FS=","}$7~/Nature Life/' file.csv | grep -vE '^([^,]*,){6}[^,]*Nature Life'

여기서 목표는 awk가 보는 모든 것을 인쇄한 다음 grep이 보는 모든 것을 필터링하는 것입니다(grep -v). 귀하의 grep 정규식이 귀하가 찾고 있는 것과 100% 일치하지 않을 가능성이 높습니다.

답변2

grepUTF-8 로케일에서, 적어도 GNU의 경우, UTF-8을 형성하지 않는 바이트 시퀀스가 ​​포함되어 있으면 ,[^,]*,일치하는 항목이 없습니다.,something,something유효한 문자.

예를 들어:

$ printf '1,\200,3,4,5,6,Nature Life,8\n' |
   grep -cE '^([^,]*,){6}[^,]*Nature Life'
0

그러나 awk 필드 분할의 경우 이는 중요하지 않습니다.

$ printf '1,\200,3,4,5,6,Nature Life,8\n' | awk -F, '$7 ~ /Nature Life/'
1,�,3,4,5,6,Nature Life,8

grep잘못 인코딩된 텍스트 문제를 방지하려면 under를 실행하세요 (검색되는 문자열과 구분 기호( )가 ASCII 형식인 LC_ALL=C경우 ).,

$ printf '1,\200,3,4,5,6,Nature Life,8\n' |
   LC_ALL=C grep -cE '^([^,]*,){6}[^,]*Nature Life'
1

관련 정보