Como eu gero uma lista dos caracteres que ocorrem antes de um determinado caractere apenas em linhas que contêm outro caractere específico usando regex?

3

Eu tenho um arquivo de texto com esta aparência:

407-OL?
408-2-OL?
408-OL?
418-het?
420-1 and 2- OL?
429-2-left unscored?
430-2-left both unscored?
431-1 and 2- Ri??
436-1-just homozygote?
444-2-het? ins. both
456-2-ins 246 despite slight OL
456-1-ins 245 (weaker)
457-2-Ri?

Eu quero que ele retorne os números à esquerda (antes do traço), mas apenas para as linhas que contêm um ponto de interrogação. Em outras palavras, quero que isso seja a saída:

407
408
408
418
420
429
430
431
436
444
457
    
por Atticus29 06.05.2012 / 18:42

3 respostas

3

Método provavelmente mais fácil: cat some_file | grep '?' | cut -d'-' -f1

  • cat somefile = > Alimente o conteúdo de some_file no pipe
  • grep '?' = > filtrar apenas linhas contendo um ?
  • cut -d'-' -f1 = > divida a string em campos com - como separador de campo e, em seguida, imprima o campo # 1
por 06.05.2012 / 18:56
3

Normalmente, uma tarefa para sed ou awk :

sed -n '/?/s/-.*//p' some_file

awk -F- '/\?/{print$1}' some_file
    
por 06.05.2012 / 19:02
0

O mais fácil seria pegar cada número por ^\d+ regex, por exemplo:

grep '?' file.txt | grep -o '^\d\+'

onde:

  • ^ início da linha
  • \d\+ corresponde a qualquer caractere de dígito mais de uma vez
por 12.11.2015 / 13:53