Как мне выполнить grep и отсортировать, используя этот конкретный шаблон?

Поведение разделителя записей и полей может быть установлено в определенных программах, таких как awk, и редко выполняется с помощью переменных среды. Обычные утилиты, такие как cat, не имеют такого типа функций: только документированные программы (например, cut) имеют возможности использования различных разделителей записей или полей.

awk является наиболее гибким из упомянутых, с переменными, которые могут быть установлены как для записей, так и для разделителей полей:

FS
Регулярное выражение разделителя полей ввода; a по умолчанию.
OFS
Разделитель полей вывода печатного оператора; по умолчанию.
ORS
Разделитель записей вывода печатного оператора; a по умолчанию.
RS
Первый символ строкового значения RS должен быть разделителем входных записей; a по умолчанию. Если RS содержит более одного символа, результаты не указаны. Если RS равно null, то записи разделяются последовательностями, состоящими из плюс одна или несколько пустых строк, начальные или конечные пустые строки не должны приводить к пустым записям в начале или конце входных данных, а всегда должен быть разделителем полей, независимо от значения FS.

Вы можете установить эти переменные в скрипте, например, ,

awk ' BEGIN { RS=" "; } { print; }' < inputfile

для печати каждого слова файла в новой строке. Вы также можете назначить любую переменную с помощью опции -v:

awk -v  RS=" " '{ print; }' < inputfile

Наконец, awk также имеет опцию -F (разделитель полей ввода), которая совпадает с переменной FS.

Дальнейшее чтение:

3
16.05.2017, 14:37
3 ответа

Ваша команда тоже работает, нужно добавить к ней * или +:

$ grep -oP 'B.\K[\w\s\d]+' tus.txt | sort -u
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241
36
4578873831221

Или, проще говоря:

$ grep -oP 'B\*\K[^*]*' tus.txt | sort -u
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241
36
4578873831221

Или используйте awk для вывода предпоследнего *-разделенного поля:

$ awk  -F'[*]' '{print $5}' tus.txt | sort -u
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241
36
4578873831221
4
27.01.2020, 21:07

Ввод разделен *. Получите пятое поле:

$ cut -d '*' -f 5 tus.txt
222791885833
36
00081907
00082025
262105589241-20172-31489016
00081684
00082024
4578873831221
00082603
00082403

Это желаемый результат, который вы упомянули, но вы также говорите о его сортировке:

$ cut -d '*' -f 5 tus.txt | sort -u
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
262105589241-20172-31489016
36
4578873831221

Если вы по какой-то причине хотите отсортировать исходные данные в этом поле (здесь не удаляются дубликаты):

$ sort -t '*' -k5,5 tus.txt
~TUS*21758767*4932626*B*00081684*Y*2707792
~TUS*21758806*4932668*B*00081907*Y*2707826
~TUS*21758861*4932693*B*00082024*Y*2707881
~TUS*21758851*4932694*B*00082025*Y*2707871
~TUS*21759295*4932379*B*00082403*Y*2708332
~TUS*21760350*4933404*B*00082603*Y*2708838
~TUS*21424565*4716129*B*222791885833*Y*
~TUS*21758862*4932739*B*262105589241-20172-31489016
~TUS*21470045*4733746*B*36*Y*19-OCT-16**B*2239681
~TUS*21758895*4932764*B*4578873831221*Y*
10
27.01.2020, 21:07

Используйте следующий подход:

grep -Po '(?<=\*B\*)[^*]+' tus.txt | sort -u

Вывод:

00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241-20172-31489016
36
4578873831221

Обратите внимание, sort -u изменит порядок начального grep вывода

3
27.01.2020, 21:07

Теги

Похожие вопросы