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

grep至少对于 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

运行grepunderLC_ALL=C以避免出现编码错误的文本问题(只要要搜索的字符串和分隔符 ( ,) 均为 ASCII 格式)。

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

相关内容