Script Shell: saisissez une chaîne au milieu du texte, parfois au début

9

J'ai un grand fichier texte dont une partie ressemble à ceci (valeurs modifiées):

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

Je veux toujours saisir (avec un cutou awkou quelque chose d'autre) la chaîne qui commence par XXXX00, mais ce n'est jamais dans le même numéro de champ.

Comment puis-je faire cela dans un shell-script?

Vitor Gatti
la source

Réponses:

12

Juste greppour ça:

grep -oE 'XXXX00[0-9]*' file
  • -o: Imprime uniquement la partie correspondante.
  • -E: Active les expressions régulières étendues.
  • [0-9]*: Après la chaîne à rechercher, seuls les chiffres doivent apparaître.
le chaos
la source
Notez que l'expression régulière n'a pas besoin de l' -Eoption (bien qu'elle ne nuise pas).
Jonathan Leffler
6

Il semble que vous vouliez le 5ème champ à droite, donc

awk '{print $(NF-4)}' file
glenn jackman
la source
ouais!
mikeserv
3

Utilisation grepavec PCRE:

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

Vous pouvez vous en tirer avec -w(mot) dans ce cas, notez que les caractères constitutifs du mot sont considérés comme [[:alnum:]_]:

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

Quelques autres façons

Avec GNU awk

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

Avec les anciennes versions de GNU awk, cela --re-intervalpourrait être nécessaire, donc

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

Avec tretgrep

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

il semble que le nombre de champs soit différent parce que vous avez une liste de personnes là-bas, et ils ont différents nombres de noms. mais probablement aucun d'entre eux n'a un nom avec 0, donc coupez complètement jusqu'à la première chaîne délimitée par des espaces avec un dedans, enregistrez-le et coupez tout ce qui suit.

mikeserv
la source