Awk: verifique o comprimento do campo

3

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?

    
por rahmu 22.02.2012 / 19:19

3 respostas

7
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
    
por 22.02.2012 / 19:37
2

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
    
por 22.02.2012 / 20:18
1

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'
    
por 23.02.2012 / 02:57