Поведение разделителя записей и полей может быть установлено в определенных программах, таких как 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
.
Дальнейшее чтение:
Ваша команда тоже работает, нужно добавить к ней *
или +
:
$ 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
Ввод разделен *
. Получите пятое поле:
$ 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*
Используйте следующий подход:
grep -Po '(?<=\*B\*)[^*]+' tus.txt | sort -u
Вывод:
00081684
00081907
00082024
00082025
00082403
00082603
222791885833
2239681
262105589241-20172-31489016
36
4578873831221
Обратите внимание, sort -u
изменит порядок начального grep
вывода