Использование нескольких разделителей, когда один из них является символом канала - PullRequest
0 голосов
/ 08 января 2020

У меня есть текстовый файл, где поля разделены символом трубы. Поскольку текст читается человеком, для выравнивания столбцов используются пробелы.

Вот пример ввода:

+------------------------------------------+----------------+------------------+
|  Column1  |   Column2    |   Column3     |    Column4     |   Last Column    |
+------------------------------------------+----------------+------------------+
| some_text |  other_text  |  third_text   |   fourth_text  |  last_text       |
<more such lines>
+------------------------------------------+----------------+------------------+

Как использовать awk для извлечения третьего поля в этом случае ? Я пытался:

awk -F '[ |]' '{print $3}' file
awk -F '[\|| ]' '{print $3}' file
awk -F '[\| ]' '{print $3}' file

Ожидаемый результат:

<blank>
Column3
<more column 3 values>
<blank>
third_text

Я пытаюсь добиться этого с помощью одной команды awk. Разве это не возможно?

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

Ответы [ 3 ]

4 голосов
/ 08 января 2020

Я что-то упустил?

Пример ввода:

+------------------------------------------+----------------+------------------+
|  Column1  |   Column2    |   Column3     |    Column4     |   Last Column    |
+------------------------------------------+----------------+------------------+
| some_text |  other_text  |  third_text   |   fourth_text  |  last_text       |
| some_text2|  other_text2 |  third_text2  |   fourth_text2 |  last_text2      |
+------------------------------------------+----------------+------------------+ 

Команда:

gawk -F '[| ]*' '{print $4}' <file>

Вывод:

<blank>
Column3
<blank>
third_text
third_text2
<blank>

Работает для каждого столбца (вам просто нужно использовать i+1 вместо i, поскольку в первом столбце пустые значения или +-----).

1 голос
/ 08 января 2020

лучше подходит для этого случая использования:

$ perl -F'\s*\|\s*' -lane 'print $F[3]' File
#      ____________
#           ^
#           |
#  FULL regex support with -F switch (delimiter, like awk, but more powerful)
0 голосов
/ 08 января 2020

Первая предварительная обработка с sed - удалить первую, третью и последнюю строку, заменить все пробелы + | + на один |, удалить ведущие | - затем просто разделить с помощью awk, используя | (может быть действительно cut -d'|' -f3).

sed '1d;3d;$d;s/ *| */|/g;s/^|//;' |
awk -F'|' '{print $3}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...