Shell Script: peguem uma string no meio do texto, às vezes no começo

9

Eu tenho um arquivo de texto grande em que uma parte dele se parece com isso (valores editados):

JULIANA XXXX006060 LI1033322 THC BRL 730.00
XXXX006296 AA1004737 THC BRL 1,740.00
SANTOS JULIANA XXXX006668 AA1004786 THC BRL 8,150.00
SANTOS JULIANA CABINDA XXXX006697 AA1004777 THC BRL 2,325.00
SANTOS JULIANA XXXX006699 AA1004790 THC BRL 2,325.00
JULIANA BATA XXXX006141 CCC012946 THC BRL 1,460.00
JULIANA BATA XXXX006153 CCC013054 THC BRL 870.00
JULIANA XXXX006269 CCC013105 THC BRL 870.00
JULIANA XXXX006295 CCC013083 THC BRL 870.00
JULIANA BATA XXXX006305 CCC013043 THC BRL 1,460.00

Eu quero sempre pegar (com um cut ou awk ou outra coisa) a string que começa com XXXX00 , mas nunca está no mesmo número de campo.

Como posso fazer isso em um script de shell?

    
por Vitor Gatti 27.11.2015 / 19:27

5 respostas

12

Apenas grep para isso:

grep -oE 'XXXX00[0-9]*' file
  • -o : imprime apenas a parte correspondente.
  • -E : ativa as expressões regulares estendidas.
  • [0-9]* : Após a string de pesquisa, apenas números devem aparecer.
por 27.11.2015 / 19:32
6

Parece que você quer o quinto campo da direita, então

awk '{print $(NF-4)}' file
    
por 27.11.2015 / 20:44
3

Usando grep com o PCRE:

% grep -Po '(^|\s)\KXXXX00[^\s]*(?=(\s|$))' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

Você pode usar -w (word) nesse caso, observe que os caracteres constituintes do word são considerados [[:alnum:]_] :

% grep -wo 'XXXX00[^ ]*' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305
    
por 27.11.2015 / 19:31
2

Algumas outras maneiras

Com o GNU awk

awk -vRS='[[:space:]]+' '/^X{4}0{2}/' file

Com versões mais antigas do GNU awk , --re-interval pode ser necessário, então

awk --re-interval -vRS='[[:space:]]+' '/^X{4}0{2}/' file

Com tr e grep

<file tr -s '[:space:]' '[\n*]' | grep '^X\{4\}0\{2\}'
    
por 27.11.2015 / 19:51
1
sed 's/[^0]*  *\([^ ]*\).*//' <in >out

Parece que as contagens de campo são diferentes porque você tem uma lista de pessoas e elas têm diferentes números de nomes. mas provavelmente nenhum deles tem um nome com 0, então basta cortar completamente até a primeira string delimitada por espaço com um, salvá-lo e cortar tudo o que se segue.

    
por 27.11.2015 / 19:37