Shell Script: agarra una cadena en el medio del texto, a veces al principio

9

Tengo un archivo de texto grande donde una parte se ve así (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

Quiero siempre agarrar (con una cutu awkotra cosa) la cadena que comienza XXXX00, pero nunca está en el mismo número de campo.

¿Cómo puedo hacer eso en un script de shell?

Vitor Gatti
fuente

Respuestas:

12

Solo greppor eso:

grep -oE 'XXXX00[0-9]*' file
  • -o: Imprime solo la parte correspondiente.
  • -E: Activa expresiones regulares extendidas.
  • [0-9]*: Después de la cadena de búsqueda, solo deben aparecer los números.
caos
fuente
Tenga en cuenta que la expresión regular no necesita la -Eopción (aunque no hace daño).
Jonathan Leffler
6

Parece que quieres el quinto campo desde la derecha, así que

awk '{print $(NF-4)}' file
Glenn Jackman
fuente
si!
mikeserv
3

Utilizando grepcon PCRE:

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

Puede salirse con la -w(palabra) en este caso, tenga en cuenta que los caracteres constitutivos de la palabra se consideran como [[:alnum:]_]:

% grep -wo 'XXXX00[^ ]*' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305
heemayl
fuente
2

Un par de otras formas

Con GNU awk

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

Con versiones anteriores de GNU awk, --re-intervalpodría ser necesario, así que

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

Con trygrep

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

parece que los recuentos de campos son diferentes porque tienes una lista de personas allí y tienen diferentes números de nombres. pero probablemente ninguno de ellos tenga un nombre con 0, así que simplemente corte completamente hasta la primera cadena delimitada por espacios con uno, guárdelo y corte todo lo que sigue.

mikeserv
fuente