Grep número exato de dígitos e alguns outros caracteres

5

Gostaria de analisar um arquivo contendo números de 5 dígitos separados por vírgula ou traço, linhas como:
12345,23456,34567-45678,12345-23456,34567

Meu objetivo é encontrar linhas com formatação incorreta, por exemplo. linhas que contêm números que não são compostos por 5 dígitos separados por outros caracteres além de vírgula ou traço.

Eu tentei egrep o arquivo com:

cat file.txt | egrep -v [-,]*[0-9]{5}[,-]*

  • mas se eu tiver um número de 6 dígitos, ele será correspondido e a linha não será exibida
  • e se eu tiver um número de 4 dígitos, não é correspondido, mas outros números de essa mesma linha é correspondida e a linha não é exibida

Para especificar o conteúdo das linhas:

  • um número deve ter 5 dígitos
  • os intervalos são definidos com traço, como 12345-12389
  • uma linha pode conter de um único número a vários números e intervalos em qualquer ordem

Alguma sugestão, por favor?

    
por mazs 15.04.2016 / 10:29

3 respostas

10
grep -vxE '([0-9]{5}[,-])*[0-9]{5}'

Informaria as linhas incorretas.

Ou se você também quiser proibir 12345-12345-12345 :

num='[0-9]{5}'
num_or_range="$num(-$num)?"
grep -vxE "($num_or_range,)*$num_or_range"
    
por 15.04.2016 / 10:53
5

Para uma boa solução grep , consulte a resposta de Stéphane . Como alternativa, aqui está um Perl:

perl -ne 'print if grep{$_!~/^\d{5}$/} split(/[,-]/); ' file 

Isso dividirá cada linha de entrada em , ou - e, em seguida, procurará membros da matriz dividida que não contenham exatamente cinco números. Se algum for encontrado, a linha é impressa.

    
por 15.04.2016 / 10:37
3

Você não precisa de cat . Isso faz o que você quer:

 $ grep -v -E '^([0-9]{5}(,|-))+' <FILE>

Por exemplo, se FILE tiver o seguinte conteúdo:

12345,23456,34567-45678,12345-23456,34567
1,2
12345*23456,34567-45678,12345-23456,34567
123456
1234*23456,34567-45678,12345-23456,34567

o resultado seria:

$ grep -v -E '^([0-9]{5}(,|-))+' 5d
1,2
12345*23456,34567-45678,12345-23456,34567
123456
1234-23456,34567-45678,12345-23456,34567
    
por 15.04.2016 / 10:37