Разделение имен через «| символ »для отдельных пар

Одно из решений для этого (используется, в частности, на рабочем столе Linux, но также применимо в других случаях) - использовать D-Bus для активации небольшой службы, работающей от имени пользователя root, и polkit для сделать авторизацию. Это в основном то, для чего был разработан пакет polkit; из вводной документации :

polkit предоставляет API авторизации, предназначенный для использования привилегированными программами («МЕХАНИЗМЫ»), предлагающими услуги непривилегированным программам («КЛИЕНТЫ»). См. Страницу руководства polkit для получения информации об архитектуре системы и общей картине.

Вместо того, чтобы запускать вашу вспомогательную программу, большая непривилегированная программа отправит запрос по шине. Ваш помощник может либо работать как демон, запускаемый при загрузке системы, либо, лучше, быть активирован при необходимости с помощью systemd . Затем этот помощник будет использовать polkit для проверки того, что запрос исходит из авторизованного места. (Или, в данном случае, если это кажется излишним, вы можете использовать какой-нибудь другой жестко запрограммированный механизм аутентификации / авторизации.)

Я нашел хорошую базовую статью о взаимодействии через D-Bus , и пока я его не тестировал, это, кажется, простой пример добавления polkit в микс .

При таком подходе ничего не нужно отмечать как setuid.

1
27.02.2015, 22:53
3 ответа
$ awk '{split($1,a,"|"); split($2,b,"|"); for (i in a) {for (j in b) print a[i],b[j];}}' file
TMPRSS2 AADAT
pp9284 AADAT
ERG TMPRSS2
ERG pp9284
TMPRSS2 ETV1
pp9284 ETV1
PDE4A RAB4B-EGLN2
PDE4A EGLN2
PDE4A MIA
PDE4A MIA-RAB4B
PDE4A RAB4B

Чтобы также распечатать третье поле ( SampleN ), вы можете просто добавить $ 3 в оператор печати внутри циклов, то есть

$ awk '{split($1,a,"|"); split($2,b,"|"); for (i in a) {for (j in b) print a[i],b[j],$3;}}' file
TMPRSS2 AADAT Sample1
pp9284 AADAT Sample1
ERG TMPRSS2 Sample2
ERG pp9284 Sample2
TMPRSS2 ETV1 Sample3
pp9284 ETV1 Sample3
PDE4A RAB4B-EGLN2 Sample4
PDE4A EGLN2 Sample4
PDE4A MIA Sample4
PDE4A MIA-RAB4B Sample4
PDE4A RAB4B Sample4
4
29.04.2021, 00:31

С помощью bash:

# important to use parentheses, not braces, to localize changes to IFS
# the variable is purposefully unquoted
split_pipe() ( IFS='|'; echo $1 )

while read -r first second third; do
  for word1 in $(split_pipe "$first"); do
    for word2 in $(split_pipe "$second"); do
      echo $word1 $word2 $third
    done
  done
done < file
4
29.04.2021, 00:31

С помощью GNU sed вы можете:

sed -E 's/(\|[^ |]+) /\1| /
        s/(([^|]* )?([^|]*))\|(([^ ]*)(.*))/\1\6\n\2\4/
        /\n/P;D' <infile

... который печатает ...

TMPRSS2 AADAT Sample1
pp9284 AADAT Sample1
ERG    TMPRSS2 Sample2
ERG    pp9284 Sample2
TMPRSS2 ETV1 Sample3
pp9284 ETV1 Sample3
PDE4A   MIA Sample4
PDE4A   MIA-RAB4B Sample4
PDE4A   RAB4B Sample4
PDE4A   RAB4B-EGLN2 Sample4
PDE4A   EGLN2 Sample4

Он работает путем разделения и печать с последующим частичным удалением содержимого строки на дополнительных \ n символах ewline. Команда P P печатает только до первой появившейся \ n строки в пространстве шаблонов, поэтому вы можете довольно легко распечатать только часть своего буфера редактирования как тебе нравится.

В этом случае для каждого разделенного на конвейер раздела, не содержащего пробелов, sed помещает все биты на обоих концах буфера редактирования дважды. sed вставляет крайний левый и крайний правый концы слева и справа от самой левой секции, разделенной на каналы, и следует этой последовательности с помощью \ n ewline, затем он помещает те же выборки в любой конец всех разделенных трубопроводами секций, которые остаются с правой стороны его вставленной \ n прямой линии. Итак, sed может P ринтировать только бит слева, если в пространстве шаблонов вообще есть \ n ewline, тогда D выберите только до первой встречающейся \ n строки ewline в пространстве шаблонов и повторите попытку.

Самая первая подстановка происходит только один раз - она ​​просто добавляет канал к концу секций, разделенных трубкой, так что всегда будет канал для разделения - даже для последнего случая.В остальное время sed выполняет одно s /// ubstitution, P записывает первую строку в пространстве шаблонов, затем D избирает то же самое. Когда он больше не может этого делать, он D удаляет все пространства шаблонов и автоматически вставляет следующую строку ввода.

Чтобы сделать то же самое, можно написать POSIX BRE:

sed '   s/\(|[^ |]\{1,\}\) /\1| /
        s/^\(\( *[^ |]*  *\)*\([^ |]*\)\)|\(\([^ ]*\)\(.*\)\)/\1\6\
\2\4/;   /\n/P;D' <infile
1
29.04.2021, 00:31

Теги

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