Классифицировать список с помощью awk

Диалоговые окна в сценариях конфигурации пакетов Debian обычно обрабатываются debconf; пакеты, которые поддерживают это, будут иметь соответствующие файлы .configи .templatesв /var/lib/dpkg/info(, например./var/lib/dpkg/info/tzdata.configи /var/lib/dpkg/info/tzdata.templates). (Это дает и другие преимущества, такие как простая поддержка предварительного -заполнения.)

Выполнение dpkg-reconfigureзапускает сценарий postinstсопровождающего пакета в режиме configure, поэтому то, что происходит, когда вы это делаете, действительно зависит от того, что предоставляет сопровождающий. Большинство пакетов предназначены для автоматической установки, поэтому они не обеспечивают интерактивную настройку через dpkg-reconfigure.

Дополнительные зеркала aptнастраиваются модулем установщика, а не скриптом postinst, и, насколько мне известно, они недоступны после установки.

2
15.12.2019, 14:05
2 ответа

Использованиеawk:

awk '
$0=="General" || $0=="Idiom"{
  type=$0;  getline
  group=$0; getline

  key=type","group  
  if (key in b){
    b[key]=b[key]"\n"$0
  }
  else {
    if (type=="General" && !isfirstgeneral){
      type=type"\n"; isfirstgeneral=1
    }
    else if (type=="Idiom" && !isfirstidiom){
      type=type"\n"; isfirstidiom=1
    }
    else {
      type=""
    }
    a[++cnt]=key
    b[key]=type group"\n"$0
  }
}
END{
  for (i=1;i<=cnt;i++){
    print b[a[i]]
    if (i<cnt) print "-"
  }
}' file

Если это строка Generalили Idiom, сохраните эту строку как typeи получите следующие две строки (с именем groupи "определение" с именем$0).

Два массива используются как уловка для предотвращения awkвозможного хаотического упорядочения элементов массива при зацикливании:

  • массив aс целочисленным ключом хранит ключ массива b, состоящего из typeи следующей groupстроки
  • массив bсодержит собранную строку для данного ключа

Если комбинированный ключ для массива bне существует, создайте два новых элемента массива. Строки typeсохраняются только при первом их обнаружении. (, если это была ошибка в выводе, то удалите блокif-else if-else-и замените b[key]=type group"\n"$0на b[key]=type"\n"group"\n"$0).

Если ключ существует, добавьте строку «определение» к существующему значению массива.

В части ENDвыведите значения массива b, используя порядок массива a, за которым следует разделительная строка.

(Я сохранил ваш ввод как файл file, но вы можете передать вывод вашей команды curlв этот awk-скрипт, если хотите.)

Выход:

General
hit
definition 1
definition 2
-
Idiom
hit the sack
Definition
-
hit the buffers
Definition 1
Definition 2

Обновление

Чтобы использовать список категорий, добавьте свои категории в текстовый файл, по одной строке на категорию.

Примерcategories.txt:

General
Idiom
Computer
What ever

Измените сценарий на

awk '
NR==FNR{
  cat[$0]; next
}
$0 in cat{
  type=$0;  getline
  group=$0; getline

  key=type","group  
  if (key in b){
    b[key]=b[key]"\n"$0
  }
  else {
    a[++cnt]=key
    b[key]=group"\n"$0
  }
}
END{
  for (i=1;i<=cnt;i++){
    # print first occurrence of category
    catname=a[i]
    sub(/,.*/, "", catname)
    if (catname in cat){
      print catname
      delete cat[catname]
    }

    print b[a[i]]
    if (i<cnt) print "-"
  }
}' categories.txt file
0
27.01.2020, 22:24

Несколько дерзкое использование awkассоциативных массивов.....

awk '$0=="General"||$0=="Idiom"{
    cat=$0;getline; def=$0; getline;
    (cat=="General")?gen[def]=gen[def]"\n"$0:idi[def]=idi[def]"\n"$0
}END{
    print "General";for (g in gen) print g, gen[g]"\n-";
    print "Idioms";for (i in idi) print i, idi[i]"\n-"
}' file

Выход:

General
hit 
definition 1
definition 2
-
Idioms
hit the buffers 
Definition 1
Definition 2
-
hit the sack 
Definition
-

Это предполагает, конечно, что все ваши определения являются "однострочными"

Больше категорий Не беспокоясь о порядке появления категорий...

awk '{
    cat=$0; getline; phr=$0;getline; def=$0; getline;
    cats[cat];defs[phr]=cat;txt[phr]=txt[phr]"\n"def
}END{
    for (c in cats) {
        print c":"; for (d in defs) {
            if (defs[d]==c) print d, txt[d]"\n-"
        }
    }
}' file

Вход

General
hit
Strike a blow.
-
General
hit
A successful search result. 
-
Idiom
hit the sack
Go to bed.
-
Idiom
hit the buffers
Reach the end of the line.
-
Idiom
hit the buffers
Reach the limit.
-
Bananas
Banana
A Banana

Выход

Bananas:
Banana 
A Banana
-
Idiom:
hit the buffers 
Reach the end of the line.
Reach the limit.
-
hit the sack 
Go to bed.
-
General:
hit 
Strike a blow.
A successful search result. 
-

Если вы хотите управлять выводом категории в той же последовательности, в которой вы их найдете, вам нужно будет либо перечислить их, либо создать строку, разделенную (, скажем,)|для всех cat, затем splitв перечисляемый массив, а затем используйте его как итератор для других массивов.

Здесь действительно используется 4-строчная последовательность в записях.

0
27.01.2020, 22:24

Теги

Похожие вопросы