awk -F\; 'length($3) == 30' file.csv
Se você tiver espaço em branco (como aparece), você pode se livrar dele, tornando-o parte do separador de campo:
awk -F' *; *' 'length($3)==30' file.csv
Em awk
. Eu estou trabalhando no Solaris 10, então é provavelmente uma versão antiga (er) de awk
.
Eu inventei este one-liner rudimentar que funciona, pelo menos para minha contribuição particular.
awk -F\; '$3 ~ /[ ]*...............................*/' file.csv
Pode haver ou não espaços ao redor dos separadores, portanto, a parte [ ]*
da regex.
Querendo evitar imprimir 30 vezes o caractere .
do ponto , tentei o seguinte:
awk -F\; '$3 ~ /[ ]*.\{30\}.*/{print $3}' file.csv
Isso não retornou nenhum resultado. Se isso ajudar de alguma forma, estou usando ksh88
.
Qual seria a melhor maneira de evitar entrar nesses 30 pontos consecutivos?
O GNU awk nem sempre corresponde às expressões de intervalo, que é o que a sintaxe {n} está solicitando. Os awks compatíveis com POSIX podem aceitar -W re-interval
para ativar a sintaxe, então tente isso. Mas você pode estar executando o awk derivado do System V que não aceita a sintaxe do intervalo.
Acho que sua melhor aposta é definir o FS para uma expressão regular, o que permitirá que você trate os espaços ao redor do ponto-e-vírgula como parte do separador de campo. Este é um recurso awk muito mais antigo e provavelmente terá suporte no awk que você possui. Com os espaços fora do caminho, você pode dispensar o regexp cheio de pontos e usar a função length () para verificar o comprimento do campo.
awk -F"[ ]*;[ ]*" 'length($3) == 30 { print $3 }' file.csv
Se bem entendi, você deseja imprimir as linhas em que o terceiro campo tenha pelo menos 30 caracteres, excluindo o espaço em branco adjacente.
awk -F ';' 'match($3, "[^ ].*[^ ]") && RLENGTH >= 30'
Tags awk regular-expression