Como imprimir apenas correspondências exclusivas de uma expressão regular?

2

Suponha que eu tenha um arquivo com o seguinte texto:

  1. Number_1
  2. Number_3
  3. Number_1
  4. Número_4

Como posso usar um regexp para imprimir apenas uma vez cada Number_n diferente? Usando:

grep -oE "Number_\w+" 

Me dá de volta todos os jogos:

Number_1

Number_3

Number_1

Number_4

Mas eu quero a seguinte saída:

Number_1

Number_3

Number_4

    
por user9008 04.04.2017 / 23:42

4 respostas

3

grep -oE "Number_\w+"  | sort -u
    
por 05.04.2017 / 00:20
2

(Ah ok, a edição muda um pouco a questão.)

A maneira fácil de imprimir apenas uma cópia de cada linha de saída é percorrer sort -u (ou sort | uniq ), embora isso obviamente ordene a saída.

Outras soluções relacionadas aqui: Imprimindo linhas exclusivas

(A resposta para o que eu pensava originalmente era a questão :)

Para imprimir apenas a primeira string que corresponde à regex, podemos usar grep -m1 ... :

-m NUM, --max-count=NUM
          Stop reading a file after NUM matching lines. 

Se as correspondências estiverem em linhas diferentes, isso funciona diretamente, mas Se você tiver várias sequências correspondentes na mesma linha, com -o , todas elas serão impressas, então adicione algo como | head -1 .

    
por 04.04.2017 / 23:48
0

Com o GNU grep :

$ echo Number_1 Number_2 | grep -Pom1 '^.*?\KNumber_\d+'
Number_1

Isso corresponde do início da linha até a primeira ocorrência de Number_\d+ , mas com \K , descarta o que está à esquerda dele.

    
por 04.04.2017 / 23:57
0
$ awk '{print $NF}' file | sort -u
Number_1
Number_3
Number_4

$ awk '{Arr[$NF]++}END{for(i in Arr)print i}' file
Number_3
Number_4
Number_1
    
por 06.04.2017 / 10:58

Tags