Вот одно из решений
echo "key11=val1|key12=val2|key13=val3" \
| awk -F'[=|]' '{
for (i=1;i<=NF;i+=2){
printf("%s%s", $i, (i<(NF-1))?"|":"")
}
print""
}'
output
key11|key12|key13
Оно также должно работать, передавая имя файла в качестве аргумента awk
, то есть
awk -F'[=|]' '{for (i=1;i<=NF;i+=2){printf("%s%s", $i, (i<(NF-1))?"|":"") }print""}' file1 [file_more_as_will_fit]
Обсуждение
Мы используем многосимвольное значение для FS (FieldSeperator), чтобы каждый символ =
и |
отмечал начало нового поля.
-F'[=|]'
Поскольку мы знаем, что хотим начать с поля1 для вывода и пропустить все остальные поля, мы используем
for (i=1;i<=NF;i+=2)
printf
форматирует вывод, как определено строкой формата '%s%s'
. Для области printf
формата доступно несколько вариантов, но вам нужно только значение для $i
(значение зацикливания, генерирующее ключ) и указание, печатать ли символ |
или нет.
printf("%s%s", $i ...)
И мы используем троичный оператор awk
, который оценивает, какой номер элемента обрабатывается (i<..)
. Если это поле не является вторым по последнему, то генерируется символ |
.
(i<(NF-1))?"|":""
IHTH