Как отсортировать строки в определенном порядке, так как это собственный блок строк

Nepomuk больше нет, Baloo полностью заменяет Nepomuk и предлагает функции индексирования файлов, ранее предлагаемые Nepomuk.

Baloo также взаимодействует с Akonadi и предлагает индексирование почты и все другие семантические возможности, связанные с приложениями Kontact.

Функции индексирования файлов Baloo и индексирования почты полностью независимы. Отключение индексатора файлов не приведет к остановке индексатора почты. В настоящее время (KDE SC 4.13.0) невозможно отключить функции индексации почты без перекомпиляции компонентов и приложений PIM.

Чтобы отключить индексатор файлов, в настоящее время есть два метода:

  1. добавить ваш домашний каталог в черный список Baloo в системных настройках
  2. добавить Hidden = True в ~ / .kde4 / share / autostart / baloo_file.desktop

файл baloo_file.desktop можно скопировать в ваш дом из /usr/share/autostart/baloo_file.desktop

Первый способ - больше пользователей дружественен, но не всегда работает (в программе отслеживания ошибок KDE есть ошибка, связанная с этой проблемой).

В будущей версии будет предоставлен переключатель включения / выключения для более интуитивного отключения индексатора файлов.

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

0
25.10.2018, 01:37
4 ответа

Так как вы хотите жестко -кодировать "сортировку", пусть awk скомпилирует данные для каждого блока в ассоциативный массив, а затем распечатает этот массив в нужном вам порядке:

scriptfile.awk

BEGIN {
  FS=":"
}

/./ {
  values[$1]=$0
}

/^$/ {
  print values["loginName"]
  print values["cabLoginID"]
  print values["session"]
  print values["userAgent"]
  print values["sessionStartTime"]
  print values["memoryInfo"]
  print values["totalJSHeapSize"]
  print values["usedJSHeapSize"]
  print ""
  delete values
}

END {
  print values["loginName"]
  print values["cabLoginID"]
  print values["session"]
  print values["userAgent"]
  print values["sessionStartTime"]
  print values["memoryInfo"]
  print values["totalJSHeapSize"]
  print values["usedJSHeapSize"]
}

Затем запустите:

awk -f scriptfile.awk < input

В качестве альтернативы, если вам все равно, в каком порядке находятся строки блоков, но вы хотите, чтобы они по-прежнему были последовательно упорядочены, и у вас есть GNU awk,

gnuscript.awk

BEGIN {
  FS=":"
  PROCINFO["sorted_in"]="@val_str_asc";
}

/./ {
  values[$1]=$0
}

/^$/ {
  asort(values)
  for (element in values)
    print values[element]
  print ""
  delete values
}

END {
  asort(values)
  for (element in values)
    print values[element]
}

Приведенный выше скрипт печатает строки каждого блока в алфавитном порядке:

cabLoginID:053XCDTF8D4J6PD3BG8P
loginName:jack
memoryInfo:jsHeapSizeLimit:2217857988
session:cabSessionID:052FPBP6Q6X2XGERWHBT
sessionStartTime:2018-10-01T01:04:10.899Z
totalJSHeapSize:42358792
usedJSHeapSize:36482584
userAgent:Mozilla/5.0
...
1
28.01.2020, 02:23

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

Так как меня беспокоит то, что awk не перехватывает все строки из-за двоеточий во временах, я написал этот небольшой сценарий оболочки. Это фактически сортирует их по блокам. Порядок, в котором он у вас есть в блоках, определяется функцией printf. Обновите это, чтобы удовлетворить ваши потребности.

#!/bin/bash

declare -A arr

(
  while read l; do
    if [[ "" == "${l}" ]]; then
      printf "loginName:%s~cabLoginID:%s~session:%s~userAgent:%s~sessionStartTime:%s~memoryInfo:%s~totalJSHeapSize:%s~usedJSHeapSize:%s~\n" ${arr[loginName]} ${arr[cabLoginID]} ${arr[session]} ${arr[userAgent]} ${arr[sessionStartTime]} ${arr[memoryInfo]} ${arr[totalJSHeapSize]} ${arr[usedJSHeapSize]}
      unset arr
      declare -A arr
      continue
    fi
    k=${l%%:*}
    v=${l#*:}
    arr[${k}]=${v}
  done
  printf "loginName:%s~cabLoginID:%s~session:%s~userAgent:%s~sessionStartTime:%s~memoryInfo:%s~totalJSHeapSize:%s~usedJSHeapSize:%s~\n" ${arr[loginName]} ${arr[cabLoginID]} ${arr[session]} ${arr[userAgent]} ${arr[sessionStartTime]} ${arr[memoryInfo]} ${arr[totalJSHeapSize]} ${arr[usedJSHeapSize]}
) | sort | tr '~' '\n'

exit 0
1
28.01.2020, 02:23

Вы можете использовать Perl в режиме абзаца с настраиваемым порядком сортировки, определяемым с помощью хэша, например.

perl -00 -F'\n' -ne '
our %rank; 
BEGIN {
  %rank = (
    loginName => 1,
    cabLoginID => 2,
    session => 3,
    userAgent => 4,
    sessionStartTime => 5,
    memoryInfo => 6,
    totalJSHeapSize => 7,
    usedJSHeapSize => 8
  );
}

%h = ();
map { ($k,$v) = split(/:/, $_, 2); $h{$k} = $v } @F;
for $k (sort { $rank{$a} <=> $rank{$b} } keys %h) { print "$k:$h{$k}\n" };
print "\n";
' file
1
28.01.2020, 02:23

Попробуйте также

awk '
BEGIN   {for (n=split("loginName cabLoginID session userAgent sessionStartTime memoryInfo totalJSHeapSize usedJSHeapSize", T); n; n--) FLSQ[T[n]] = n
        }

        {for (i=1; i<=NF; i++)  {n = split ($i, T, ":")
                                 OUT[FLSQ[T[1]]] = $i
                                }
         for (i=1; i<=NF; i++) $i = OUT[i]
         split ("", OUT)
        }
1
' RS="" ORS="\n\n" FS="\n" OFS="\n"  file
loginName:jack
cabLoginID:053XCDTF8D4J6PD3BG8P
session:cabSessionID:052FPBP6Q6X2XGERWHBT
userAgent:Mozilla/5.0
sessionStartTime:2018-10-01T01:04:10.899Z
memoryInfo:jsHeapSizeLimit:2217857988
totalJSHeapSize:42358792
usedJSHeapSize:36482584

.
.
.

В разделе BEGINон определяет последовательность полей в выходных данных каждой записи, присваивая каждой метке поля возрастающий номер. При работе с многострочными записями, разбив метку на массив T, заполняет массив OUTвсем полем, проиндексированным номером метки. Последнее действие перед печатью записи — перестроить всю $0 (= запись ). Все разделители полей и записей должны быть адаптированы к макету многострочной записи.

0
28.01.2020, 02:23

Теги

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