извлечение количества организмов с их соответствующим идентификатором?

Я не совсем понимаю, зачем вообще нужен виртуальный последовательный порт. Что произойдет, если вы просто telnet 10.0.0.1 4030?

Далее следует запустить socatбез sudoот имени обычного пользователя и выбрать доступный путь, например./tmp/vcom0(или как там ).

Если это по какой-то причине не работает, и вы, очевидно, можете sudo, попробуйте сменить владельца

sudo chown your_username /dev/virtualcom0

или разрешения

sudo chmod o+rw /dev/virtualcom0

Редактировать

Не пытайтесь создавать udevправила для конкретного псевдотерминала. Во-первых, вы не знаете заранее, какой это псевдотерминал, во-вторых, псевдотерминалы используются повсеместно, и другие программы не смогут создать этот псевдотерминал для другого пользователя.

Самое чистое решение — использовать вариант (1)(/tmp/vcom0).

Если вы настаиваете на других вариантах, создайте короткий сценарий, содержащий как socat, так и chmod/ chown, и выполните этот сценарий с помощью sudo. При необходимости вы можете переходить по символьным ссылкам с помощью readlink.

Другой альтернативой является написание короткого скрипта, который вызывает как socatкак обычный пользователь, так и stellariumс созданной им ссылкой, и уничтожает socat, когда это делается. Используйте этот скрипт для запуска stellarium.

1
30.08.2019, 09:21
2 ответа

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

awk -F'[][ ]*' '{print ($(NF-1)==n?OFS:$(NF-1)),$1; n=$(NF-1)}' OFS=, file \
 | awk -F, -v OFS=, 'NF==3{line=line RS $0;i++} NF==2{if(line)print i,line; line=$0; i=1}' \
 | column -t -n -s,

Первая команда awk извлекает и отображает нужные поля в этом формате:

Papaver_somniferum,ID1
,,ID2
,,ID3
...

Вторая команда awk строит новую строку, состоящую из всех полей с одинаковым именем, и добавляет ее счетчик впереди.

Наконец, команда столбца отображает результат в 3 столбца с помощью опции -n:

5  Papaver_somniferum    ID1
                         ID2
                         ID3
                         ID4
                         ID5
4  Helianthus_annuus     ID6
                         ID7
...
1
27.01.2020, 23:22
$ datamash -t' ' -g2 count 1 collapse 1 < <(sed 's/^\(ID[0-9]*\).*\[\([^]]*\)\]$/\1 \2/' file) \
   | awk '{ print $2,$1,$3 }' \
   | sed 's/,\(ID[^,]*\)/\n# # \1/g' \
   | column -t \
   | tr '#' ' '
5  Papaver_somniferum     ID1
                          ID2
                          ID3
                          ID4
                          ID5
4  Helianthus_annuus      ID6
                          ID7
                          ID8
                          ID9
1  Arabidopsis_thaliana   ID10
2  Citrus_sinensis        ID11
                          ID12
3  Nelumbo_nucifera       ID13
                          ID14
                          ID15
1  Helianthus_annuus      ID16
1  Zea_mays               ID17
1  Coffea_eugenioides     ID18
1  Musa_acuminata         ID19
1  Asparagus_officinalis  ID20

Шаг 1:Извлечение идентификаторов и названий организмов с помощьюsed:

$ sed 's/^\(ID[0-9]*\).*\[\([^]]*\)\]$/\1 \2/' file
ID1 Papaver_somniferum
ID2 Papaver_somniferum
ID3 Papaver_somniferum
ID4 Papaver_somniferum
ID5 Papaver_somniferum
ID6 Helianthus_annuus
ID7 Helianthus_annuus
...

Шаг 2:Передать вывод sedв GNU datamashи сгруппировать по второму полю, подсчитать и свернуть по первому полю:

$ datamash -t' ' -g2 count 1 collapse 1 < <(sed 's/^\(ID[0-9]*\).*\[\([^]]*\)\]$/\1 \2/' file)
Papaver_somniferum 5 ID1,ID2,ID3,ID4,ID5
Helianthus_annuus 4 ID6,ID7,ID8,ID9
Arabidopsis_thaliana 1 ID10
Citrus_sinensis 2 ID11,ID12
Nelumbo_nucifera 3 ID13,ID14,ID15
Helianthus_annuus 1 ID16
Zea_mays 1 ID17
Coffea_eugenioides 1 ID18
Musa_acuminata 1 ID19
Asparagus_officinalis 1 ID20

Шаг 3:Добавьте форматирование, чтобы привести вывод в табличную форму:

  • awk '{ print $2,$1,$3 }'поменять местами столбцы 2 (количество )и 1 (название организма)
  • sed 's/,\(ID[^,]*\)/\n# # \1/g'заменить каждую запятую и идентификатор на новую строку, два фиктивных символа, разделенных пробелом #и идентификатор (использовать GNUsed)
  • column -tформатировать как таблицу
  • tr '#' ' 'заменить пустые символы #пробелами
2
27.01.2020, 23:22

Теги

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