resultados diferentes de awk e grep

3

Isto dá o resultado 124:

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

Isso dá resultado 123:

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

O arquivo é muito grande para ser lido.

Alguma sugestão?

    
por Aquarius24 18.10.2015 / 20:27

2 respostas

4

Se você quiser encontrar a inconstância, o seguinte deve revelar a única linha que o awk está captando que o grep não é:

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

O objetivo aqui é imprimir tudo o que o awk vê e depois filtrar tudo o que o grep vê (grep -v). A probabilidade é que o regex do seu grep não seja 100% do que você está procurando.

    
por 20.12.2015 / 06:09
1

Para o GNU grep , pelo menos, em uma localidade UTF-8 ,[^,]*, não corresponderá a ,something, se something contiver sequências de bytes que não formam validos válidos .

Por exemplo:

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

Enquanto, para a divisão do campo awk, não importa:

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

Execute grep em LC_ALL=C para evitar problemas com texto na codificação incorreta (contanto que a string a ser pesquisada e o separador ( , ) estejam em ASCII).

$ printf '1,0,3,4,5,6,Nature Life,8\n' |
   LC_ALL=C grep -cE '^([^,]*,){6}[^,]*Nature Life'
1
    
por 21.12.2015 / 16:52

Tags