Когда у вас есть файл с записями / строками, которые состоят из пар ключ-значение в виде key1=value1_FS_key2=value2_FS_key3=value3 ...
, где _FS_
- разделитель полей (разделитель), я обычно храню все пары ключ-значение в массиве.где вы можете использовать ключ для поиска значения или объекта интереса.В данном случае это полная комбинация ключ-значение.
В awk это читается как:
awk '{for(i=1;i<=NF;++i) if(match($i,"=")) a[substr($i,1,RSTART-1)]=$i}
{ print a["user"],a["group"],a["start"],a["end"] }
{ delete a }' file
Этот метод чрезвычайно гибкий и совместим с POSIX.Следующие модификации легко сделать:
- Изменить разделитель полей:
awk 'BEGIN{FS=OFS=";"}{...}'
- Изменить поля, которые вы хотите вывести: просто обновите оператор печати
Конечно, проблема может возникнуть, если вы хотите напечатать ключ, которого нет в строке.Предположим, что «группа» не доступна в строке, в настоящее время она напечатает что-то вроде:
user=bio-wangxf start=1556506216 end=1556555583
Это может быть не то, что вы хотите, и, возможно, вы хотели бы иметь что-то вроде
user=bio-wangxf group=NA start=1556506216 end=1556555583
Это можно сделать с помощью простой функции
awk 'function lookup(key) { return (key in a ? a[key] : key"=NA") }
{for(i=1;i<=NF;++i) if(match($i,"=")) a[substr($i,1,RSTART-1)]=$i}
{ print lookup("user"),lookup("group"),lookup("start"),lookup("end") }
{ delete a }' file