Разделитель полей Awk - PullRequest
       3

Разделитель полей Awk

2 голосов
/ 15 февраля 2012

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

Я получаю пары ключ-значение, используя awk, как указано ниже, после прочтения каждой строки

key=$(echo $LINE |  awk -F " *: *" '{print $1}')
value=$(echo $LINE |  awk -F " *: *" '{print $2}')

Проблема в том, что после того, как само значение содержит «:», оно будет разделено, и я получу значение «только чтение» перед «:».

Как я могу прочитать все значение

Ответы [ 4 ]

3 голосов
/ 15 февраля 2012

Если вы просто хотите разделить на первые :, вам будет проще использовать bash манипуляции со строками:

key=${LINE%%:*}
value=${LINE#*:}

%% обрезает самую длинную строку, соответствующую ее регулярному выражению (:*), в конце строки, а # удаляет самую короткую строку, которая находится в начале строки. например,

$ LINE="a:b:c"
$ key=${LINE%%:*}
$ value=${LINE#*:}
$ echo $key
a
$ echo $value
b:c

ОК, поскольку в вашей оболочке этого нет, вы можете использовать sed:

key=$(echo "$LINE" | sed 's/:.*$//')
value=$(echo "$LINE" | sed 's/[^:]*://')

Первый находит и удаляет все, что находится между двоеточием и концом строки, и, поскольку (большинство, включая sed) регулярные выражения по умолчанию являются жадными, это будет все, начиная с первого двоеточия. Второй удаляет все, вплоть до первого двоеточия.

1 голос
/ 11 октября 2012

Ответ на старый вопрос, но использование cut сделало бы это очень просто:

key=$(echo $LINE | cut -d: -f1)
value=$(echo $LINE | cut -d: -f2-)

-f2- означает поля 2 до конца

1 голос
/ 15 февраля 2012

Вы всегда будете сталкиваться с проблемами, если поле содержит ваш разделитель.Если вы знаете, что определенное поле всегда содержит разделитель, вы можете найти обходной путь, в котором вы заменяете это вхождение на sed first:

echo $LINE | sed 's/:/|/3' | awk ...

В приведенном выше примереесли вы знали, что третье вхождение : в строке было всегда там и внутри поля, то вы могли бы заменить его на | или что-то подобное.Но это всего лишь один из способов решения проблемы;Реальный ответ заключается в том, чтобы изменить свой разделитель, если это возможно, или написать код для его анализа, который может учитывать что-то вроде escape-символов (например, \:).

0 голосов
/ 15 февраля 2012

Если ваш файл содержит символы, которые интерпретируются как символы-разделители, вам нужно заменить эти символы чем-то другим или выбрать другой разделитель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...