Comando:
awk '/"201731"/' file
produzirá apenas linhas com 201731.
Se eu entendi mal sua tarefa, corrija-me
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?
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
Tags awk