awk - разделитель как комбинация числа и |(труба) не работает - PullRequest
0 голосов
/ 09 июня 2018

У меня есть входной файл с некоторыми записями, как показано ниже,

input.txt

Record|111|aaa|aaa|11|1-bb|bb|1111|cccc|cccc
Record|11|1-aaa|aaa|111|bb|bb|1111|cccc|cccc
Record|111|aaa|aaa|11|1-bb|bb|1111|cccc|cccc
Record|111|aaa|aaa|111|bb|bb|11|1-cccc|cccc
Record|22|aaa|aaa|222|bb|bb|2222|cccc|cccc|11|1-dddd|dd
Record|333|aaa|aaa|11|1-bb|bb|333|cccc|cccc
Record|11|1-aaa|aaa|102|bb|bb|1111|cccc|cccc

Я хочу использовать разделитель|11| в awk и получите второе поле, я попробовал наиболее распространенный способ, как показано ниже,

Команда

awk -F'|11|' '{print $2}' input.txt

Вывод

1|aaa|aaa|
|1-aaa|aaa|
1|aaa|aaa|
1|aaa|aaa|
|1-dddd|dd
|1-bb|bb|333|cccc|cccc
|1-aaa|aaa|102|bb|bb|

Ожидаемый вывод

1-bb|bb|1111|cccc|cccc
1-aaa|aaa|111|bb|bb|1111|cccc|cccc
1-bb|bb|1111|cccc|cccc
1-cccc|cccc
1-dddd|dd
1-bb|bb|333|cccc|cccc
1-aaa|aaa|102|bb|bb|1111|cccc|cccc

В основном это не учитываяпоследний | разделителя |11|, вместо этого он принимает разделитель |11.

Я попробовал все ниже, ни один не дал мне ожидаемый результат,

awk -F"|11|" '{print $2}' input.txt       # gives wrong output
awk -F\|11\| '{print $2}' input.txt       # gives Wrong output
awk -v FS='|11|' '{print $2}' input.txt   # gives Wrong output

Наконец, мне нужно было написать for цикл внутри awk с разделителем как |, чтобы он работал, я хотел бы знать, почему простое решение не работает

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Сайрус объяснил , почему ваш разделитель не работает должным образом (комбинация проблем с цитированием в регулярных выражениях).

С sed, удаляя все, вплоть до |11|на каждой строке:

$ sed 's/.*|11|//' input.txt
1-bb|bb|1111|cccc|cccc
1-aaa|aaa|111|bb|bb|1111|cccc|cccc
1-bb|bb|1111|cccc|cccc
1-cccc|cccc
1-dddd|dd
1-bb|bb|333|cccc|cccc
1-aaa|aaa|102|bb|bb|1111|cccc|cccc
0 голосов
/ 09 июня 2018

Аргумент к -F является регулярным выражением.

awk -F "\\\|11\\\|" '{print $2}' file

или

awk -F '\\|11\\|' '{print $2}' file

или (благодаря EdMorton )

awk -F'[|]11[|]' '{print $2}' input.txt

Вывод:

1-bb|bb|1111|cccc|cccc
1-aaa|aaa|111|bb|bb|1111|cccc|cccc
1-bb|bb|1111|cccc|cccc
1-cccc|cccc
1-dddd|dd
1-bb|bb|333|cccc|cccc
1-aaa|aaa|102|bb|bb|1111|cccc|cccc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...