Я не совсем понимаю, зачем вообще нужен виртуальный последовательный порт. Что произойдет, если вы просто 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
.
Использование 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
...
$ 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 '#' ' '
заменить пустые символы #
пробелами