Нужна помощь в разборе файла - PullRequest
0 голосов
/ 28 июня 2018

У нас есть файл с информацией ниже:

Files: *
License: LGPL-2+
Files: po/bg.po
       po/eo.po
       po/sl.po
       po/sv.po
       po/th.po
       po/tr.po
License: LGPL-2+
Files: po/te.po
License: LGPL-2+
Files: po/vi.po
License: LGPL-2+
Files: tls/tests/mock-pkcs11.*
License: LGPL-2.1+
Files: dbus-1/dconf-dbus-1.*
       tests/gsettings.c tests/dbus1.c
License: GPL-3+
Files: debian/*
License: GPL-3
Files: po/fi.po
License: LGPL-2+

Я хочу объединить все файлы, которые находятся под одной лицензией, ища вывод в следующем формате:

LGPL-2+(*,po/bg.po,po/eo.po,po/sl.po,po/sv.po,po/th.po,po/tr.po,po/fi.po,po/te.po,po/vi.po),LGPL-2.1+(tls/tests/mock-pkcs11.*),
GPL-3+(dbus-1/dconf-dbus-1.*,tests/gsettings.c tests/dbus1.c),GPL-3(debian/*)

---- или ----

LGPL-2+(*,po/bg.po,po/eo.po,po/sl.po,po/sv.po,po/th.po,po/tr.po,po/fi.po,po/te.po,po/vi.po)
LGPL-2.1+(tls/tests/mock-pkcs11.*)
GPL-3+(dbus-1/dconf-dbus-1.*,tests/gsettings.c tests/dbus1.c)
GPL-3(debian/*)

Любая помощь приветствуется. Спасибо заранее !!

1 Ответ

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

awk, чтобы спасти:

$1=="License:"{
  a[$2]=a[$2](a[$2]?",":"")f;
  next
}
$1=="Files:"{
  f=$2
  next
}
{
  for(i=1;i<=NF;i++)
    f=f (f?",":"")$i
}
END{
  for(i in a)
    printf "%s(%s)\n",i,a[i]
}

Переменная f заполнена именами файлов. Когда ключевое слово License: найдено, все файлы в переменной f копируются в массив a.

Оператор END просто печатает содержимое массива.

Обратите внимание на (...?...:...), который является встроенным оператором стиля C if ... then ... else ..., используемым для добавления запятой , между каждым именем файла.

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