Сценарій оболонки: перетягніть рядок посередині тексту, іноді на початку


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, але ніколи не в тому ж номері поля.

Як я можу це зробити в сценарії оболонки?

Відповіді:


12

Просто grepдля цього:

grep -oE 'XXXX00[0-9]*' file
  • -o: Друкує лише відповідну частину.
  • -E: Активує розширені регулярні вирази.
  • [0-9]*: Після рядка для пошуку повинні з’являтися лише числа.

Зауважте, що регулярному вираженню не потрібна -Eопція (хоча це не шкодить).
Джонатан Леффлер


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

2

Пару інших способів

З ГНУ 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\}'

1
sed 's/[^0]*  *\([^ ]*\).*/\1/' <in >out

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.