Como faço para grep e classificar usando este padrão específico?

3

Eu quero pegar os números após o B *, mas não incluindo Y e depois dele. Tentei usar este comando que recebi de um amigo, mas não funciona:

grep -oP 'B.\K[\w\s\d]' < tus.txt | sort -u

tus.txt

~TUS*21424565*4716129*B*222791885833*Y*
~TUS*21470045*4733746*B*36*Y*19-OCT-16**B*2239681
~TUS*21758806*4932668*B*00081907*Y*2707826
~TUS*21758851*4932694*B*00082025*Y*2707871
~TUS*21758862*4932739*B*262105589241-20172-31489016
~TUS*21758767*4932626*B*00081684*Y*2707792
~TUS*21758861*4932693*B*00082024*Y*2707881
~TUS*21758895*4932764*B*4578873831221*Y*
~TUS*21760350*4933404*B*00082603*Y*2708838
~TUS*21759295*4932379*B*00082403*Y*2708332

Resultado desejado:

222791885833
36
00081907
00082025
262105589241-20172-31489016
00081684
00082024
4578873831221
00082603
00082403
    
por WashichawbachaW 16.05.2017 / 09:30

3 respostas

4

Seu comando também funciona, você precisa adicionar um * ou + a ele:

$ grep -oP 'B.\K[\w\s\d]+' tus.txt | sort -u
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241
36
4578873831221

Ou, mais simplesmente:

$ grep -oP 'B\*\K[^*]*' tus.txt | sort -u
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241
36
4578873831221

Ou use awk para imprimir o penúltimo campo * -separado:

$ awk  -F'[*]' '{print $5}' tus.txt | sort -u
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241
36
4578873831221
    
por 16.05.2017 / 09:57
10

A entrada é * -delimited. Receba o quinto campo:

$ cut -d '*' -f 5 tus.txt
222791885833
36
00081907
00082025
262105589241-20172-31489016
00081684
00082024
4578873831221
00082603
00082403

Esta é a saída desejada que você mencionou, mas você também fala sobre classificá-la:

$ cut -d '*' -f 5 tus.txt | sort -u
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
262105589241-20172-31489016
36
4578873831221

Se você, por qualquer motivo, quiser ordenar os dados originais neste campo (não removendo duplicados aqui):

$ sort -t '*' -k5,5 tus.txt
~TUS*21758767*4932626*B*00081684*Y*2707792
~TUS*21758806*4932668*B*00081907*Y*2707826
~TUS*21758861*4932693*B*00082024*Y*2707881
~TUS*21758851*4932694*B*00082025*Y*2707871
~TUS*21759295*4932379*B*00082403*Y*2708332
~TUS*21760350*4933404*B*00082603*Y*2708838
~TUS*21424565*4716129*B*222791885833*Y*
~TUS*21758862*4932739*B*262105589241-20172-31489016
~TUS*21470045*4733746*B*36*Y*19-OCT-16**B*2239681
~TUS*21758895*4932764*B*4578873831221*Y*
    
por 16.05.2017 / 09:44
3

Use a seguinte abordagem:

grep -Po '(?<=\*B\*)[^*]+' tus.txt | sort -u

A saída:

00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241-20172-31489016
36
4578873831221

Note que sort -u irá reordenar o grep output inicial

    
por 16.05.2017 / 09:34

Tags