Encontre a primeira ocorrência de um número em cada linha de um arquivo

1

Existe alguma maneira de capturar a primeira ocorrência de números em cada linha do arquivo.

Por exemplo, tenho um arquivo chamado test e o conteúdo é parecido com

AA111 1 DFJKD BKJ3 () A G C TT

BB112 DKFJ 32 JDKFJ JE () DF

113 BDNF 33 3()

E a saída desejada é

111

112

113

Cada linha na entrada começa com caracteres alfanuméricos (ou seja, alfabeto ou números; sem caracteres especiais)

    
por djskj189 07.11.2016 / 19:38

3 respostas

3

Aqui estão algumas maneiras:

sed 's/^[^0-9]*\([0-9]\+\).*//' test
cat test | tr -c '0-9\n' ' ' | while read first rest; do echo $first; done
  
gawk -F '[^0-9]+' '{print $2}' test  # requires non-digits to start line
perl -nE'say/(\d+)/?$1:""' test      # code golf

bash:

while read line; do [[ $line =~ [[:digit:]]+ ]] && echo ${BASH_REMATCH[0]} || echo; done
    
por 07.11.2016 / 19:55
1

Aqui está uma maneira de fazer isso no sed:

sed -n 's/^[^[:digit:]]*\([[:digit:]]*\).*//; /[[:digit:]]/p' test > test.out

Isto:

  1. retira potenciais não-dígitos,
  2. captura & substitui ( ) os dígitos e (qualquer outra coisa) apenas com os dígitos
  3. se a linha contiver algum dígito, imprima-o (caso contrário, use o padrão para -n não imprimir linhas)

(dica do chapéu para encorajar uma pequena compressão da minha declaração original do sed)

    
por 07.11.2016 / 19:58
0

e com o grep:

grep -oP '^\D*\K\d+' File
    
por 07.11.2016 / 21:01