Problema tentando filtrar um arquivo dat ou csv com base nos valores da primeira coluna usando o awk?

0

Eu tenho um arquivo dat:

> head file.dat 
"201731","474","1000522966","0.2670"
"201732","474","1000522966","0.3163"
"201733","474","1000522966","0.3902"
"201734","474","1000522966","0.4479"
"201735","474","1000522966","0.5960"
"201736","474","1000522966","0.2598"
"201737","474","1000522966","0.3937"
"201738","474","1000522966","0.3558"
"201739","474","1000522966","0.3344"
"201740","474","1000522966","0.5544"

Eu gostaria de filtrar para manter apenas as linhas com "201731".

Eu tentei vários comandos do awk:

awk -F , '{ if ($1 == "201731") { print } }' file.dat | head
awk -F '","' 'BEGIN {OFS=","} { if (toupper($1) == "201731")  print }' file.dat | head 
awk -F '","' '{ if (toupper($1) == "201731")  print }' file.dat | head 
awk -F ',' '{ if (toupper($1) == "201731")  print }' file.dat | head 

Nenhum deles funciona. Todos eles são executados sem erros e, em seguida, recebo um prompt vazio sem nenhuma saída.

Estou usando a versão awk GNU Awk 3.1.7.

Uma pergunta quase idêntica existe neste site com uma resposta, mas mesmo isso não funcionou. O que estou fazendo de errado?

    
por Alex Kinman 08.09.2017 / 07:03

2 respostas

1

Comando:

awk '/"201731"/' file

produzirá apenas linhas com 201731.

Se eu entendi mal sua tarefa, corrija-me

    
por 08.09.2017 / 07:14
2

Seu código:

awk -F , '{ if ($1 == "201731") { print } }' file.dat

Isso está quase correto, além do fato de que $1 , quando lido com , como delimitador de campo, também conterá as aspas duplas presentes nos dados. As outras tentativas são semelhantes por natureza, mas não tenho certeza do que você acha que toupper() faria em um número.

Você pode simplesmente usar $1 ~ /201731/ para corresponder ao primeiro campo em relação a uma expressão regular (ou $1 ~ /^"201731"$/ para especificar totalmente o conteúdo do campo desde o início do campo até o final, para proteger contra falsos positivos), ou, se você quiser verificar uma string fixa em vez de fazer uma correspondência de expressão regular, teste o campo em relação a \"201731\" .

Então, você tem

awk -F ',' '$1 ~ /^"201731"$/' file.in

ou

awk -F ',' '$1 == "\"201731\""' file.in
    
por 08.09.2017 / 08:12

Tags