Shell Script: захватить строку в середине текста, иногда в начале

9

У меня большой текстовый файл, часть которого выглядит так (отредактированные значения):

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

Я хочу всегда получать (с cutили awkили с чем-то еще) строку, которая начинается с XXXX00, но она никогда не будет в том же номере поля.

Как я могу сделать это в shell-скрипте?

Витор Гатти
источник

Ответы:

12

Просто grepдля этого:

grep -oE 'XXXX00[0-9]*' file
  • -o: Печать только соответствующей части.
  • -E: Активирует расширенные регулярные выражения.
  • [0-9]*: После строки для поиска должны появляться только цифры.
хаос
источник
Обратите внимание, что регулярное выражение не нуждается в -Eопции (хотя это не приносит вреда).
Джонатан Леффлер
6

Похоже, вы хотите 5-е поле справа, так

awk '{print $(NF-4)}' file
Гленн Джекман
источник
да!
mikeserv
3

Использование grepс PCRE:

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

Вы можете сойти с рук -w(слово) в этом случае, обратите внимание, что составляющие слова слова рассматриваются как [[:alnum:]_]:

% grep -wo 'XXXX00[^ ]*' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305
heemayl
источник
2

Пара других способов

С GNU awk

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

В старых версиях GNU awk, --re-intervalможет быть необходимо, так

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

С trиgrep

<file tr -s '[:space:]' '[\n*]' | grep '^X\{4\}0\{2\}'
Iruvar
источник
1
sed 's/[^0]*  *\([^ ]*\).*/\1/' <in >out

похоже, что количество полей отличается, потому что у вас есть список людей, и у них разное количество имен. но, вероятно, ни у одного из них нет имени с 0, так что просто полностью обрежьте до первой строки, разделенной пробелом, с одним в нем, сохраните его и обрежьте все последующее.

mikeserv
источник