Как отсортировать с разделителем, который является несколькими символами долго?

Можно ввести env выяснять, какие среды настроены.

Следующий ответ был найден из этой ссылки

  XDG_CURRENT_DESKTOP - Tells you what Windows Manager you are using

  GDMSESSION - Tells you what option you selected from the lightdm greeter to login.

Для использования их перейдите к терминалу и типу:

  echo $XDG_CURRENT_DESKTOP

(Произведет, например, 'единицу', если Вы будете использовать Единицу),

или

  echo $GDMSESSION

(Произведет, например, 'человечность', если Вы выбрали человечность во входе в систему или 'человечность, 2-ю' при выборе того во входе в систему.)

У Вас есть другие при рассмотрении ближе вывода ENV как DESKTOP_SESSION и COMPIZ_CONFIG_PROFILE

Начиная с то, что Вы ищете, является названием того, какой Менеджер окон находится в usem единственным путем, я вижу, как добраться, это путем взгляда в списке процессов. Чтобы сделать это существует команда, названная pgrep (Википедия). Я сделал следующее для завоевывания репутацию, так как параметр-l добавляет идентификатор процесса:

pgrep -l compiz |cut -d " " -f2 так как процесс работает тем же пользователем нет никакой потребности снабдить префиксом sudo часть. Можно затем использовать это для создания сценария, который делает действие на основе Менеджера окон.

Для поиска других типов просто измените слово compiz другому как mutter, kwin, и т.д.

На Ubuntu 12.04 я протестировал переменные среды XDG_CURRENT_DESKTOP и GDMSESSION и получил следующие результаты:

KDE

XDG_CURRENT_DESKTOP = GDMSESSION=kde-plasma 3-я единица

2-я единица XDG_CURRENT_DESKTOP=Unity GDMSESSION=ubuntu

XDG_CURRENT_DESKTOP=Unity GDMSESSION=ubuntu-2d

Gnome

XDG_CURRENT_DESKTOP=GNOME GDMSESSION=gnome-shell

Классик Gnome

XDG_CURRENT_DESKTOP=GNOME GDMSESSION=gnome-classic

Классик Gnome никакие эффекты

XDG_CURRENT_DESKTOP=GNOME GDMSESSION=gnome-fallback Другие основанные на Ubuntu дистрибутивы:

Чеканьте 13 (Корица)

XDG_CURRENT_DESKTOP=GNOME GDMSESSION=cinnamon

Lubuntu 12.04

XDG_CURRENT_DESKTOP=LXDE GDMSESSION=Lubuntu

5
10.12.2019, 15:37
4 ответа

Используйте, например, sed для замены строки на односимвольный разделитель, сортируйте по столбцу, а затем замените разделитель обратно:

sed -e s/FOO/X/g a.txt | sort -k 2,2 -t X | sed -e s/X/FOO/g 

Это предполагает, что известный вам символ не появляется во входных данных. Контрольный символ был бы обычным кандидатом, но вам нужно сделать выбор, основываясь на вашем знании формата ввода.

6
27.01.2020, 20:33

Попробуйте следующее:

$ perl -ane '
    push @h,[$_,(split(/FOO/))[1]];
    END {
        print map  { $_->[0] }
              sort {$a->[1] <=> $b->[1]}
              @h;
    }
' file
2FOO1FOO9
1FOO2FOO3
4FOO5FOO5

Объяснение

  • Храните каждое обращение к массиву [строка, ключ] в массиве @h: [$_,(split(/FOO/))[1]]

  • По окончании чтения файла:

    • Сортируйте ref массива в массиве @h по ключу сортируйте {$a->[1] <=> $b->[1]}
    • Извлеките исходную строку из @h и выведите на печать карту { $_->[0] }.
4
27.01.2020, 20:33

Assuming your fields are numeric, GNU sorting's version sorting might help. Установите разделитель на F так, чтобы трейлинг OO из FOO входил в поле 2, а поле 2 рассматривалось сортировкой как содержащее значения OO2, OO5 и OO1. Указание сортировки по версии в поле 2 гарантирует, что нецифровой префикс OO игнорируется и вывод упорядочивается по скользящей числовой части поля 2

sort -k2,2V -t 'F' a.txt
2FOO1FOO9
1FOO2FOO3
4FOO5FOO5

поочередно с GNU awk, если вы терпите накладные расходы решения в памяти:

awk -F'FOO' '{a[$2]=$0};END{asort(a, b, "@ind_num_asc");
for (i in b) print b[i]}' a.txt
2FOO1FOO9
1FOO2FOO3
4FOO5FOO5
2
27.01.2020, 20:33

Я думаю, что вам не нужно фокусироваться на разделителе так сильно, как следует сортировать -keys. Вы можете указать диапазон символов для ваших ключей.

info sort

...учитывая строку ввода 'foo bar', сортировка разбивает ее на поля ''фу'' и ''бар''. Разделитель полей не считается быть частью поля, предшествующего или следующего за полем, поэтому с помощью 'sort -t " " в одной и той же строке ввода есть три поля: пустое поле, "фу" и "бар". Однако, поля, которые простираются до конца строка, как '-k 2', или поля, состоящие из диапазона, как '-k 2,3', сохраняют полевые разделители, присутствующие между конечными точками .

И, как прокомментировал Стефан, это относится и наоборот - сортировать можно только по фрагменту поля с диапазоном байт, и даже по нескольким фрагментам одного и того же поля с несколькими клавишами. Таким образом, в вашем случае вы можете использовать одно и то же поле с разными диапазонами несколько раз. Смотрите?

sort -k1.5n -k1.1n --debug <<\DATA
1FOO2FOO3
4FOO5FOO5
2FOO1FOO9
DATA
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
sort: key 1 is numeric and spans multiple fields
sort: key 2 is numeric and spans multiple fields
2FOO1FOO9
    _
_
_________
1FOO2FOO3
    _
_
_________
4FOO5FOO5
    _
_
_________

Это поручает сортировку по первичному ключу, начинающемуся с 5-го байта в поле 1 и расширяющемуся до конца поля 1, и, во-вторых, сортировку от 1-го байта в поле 1 до конца поля 1. Опция --debug очень полезна при попытке сортировки сортировки , как я надеюсь, показало выше. Но вот она без отладки:

sort -k1.5n -k1.1n <<\DATA        
1FOO2FOO3
4FOO5FOO5
2FOO1FOO9
DATA

###OUTPUT###
2FOO1FOO9
1FOO2FOO3
4FOO5FOO5

Если бы Вы хотели сортировать только по одному символу для каждого из них, то Вам пришлось бы закрывать свои диапазоны. В приведенном выше примере -k1.5n работает от байта 5 до конца поля, так как спецификация ключа работает подобно:

 -k[begin field].[first byte in key],[end field].[last byte in key]

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

sort -k1.5,1.5n -k1.1,1.1n

и таким образом только сортирует на один байт для каждого ключа.

1
27.01.2020, 20:33

Теги

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