tmux: объединить все окна как панели

command comm может дать вам нужные результаты в формате, близком к вашим требованиям. В моей системе Comm (GNU coreutils) по умолчанию установлена ​​версия 8.25. Я создал два файла b и c txt, включая ваши данные и другие числа для тестирования.

comm --nocheck-order b.txt c.txt #(or file1.txt file2.txt)

Вывод:

1
                2
                3
4
        6
8
                9
        10
        11
                13
                16
        17
18
                19
20
22

1-й столбец включает записи из файла 1 без совпадений в файле 2.

2-й столбец указывает записи из файла 2 без совпадений в файле 1.

3-й столбец указывает общие / совпадающие записи в файле 1 и 2

Хотя ваши файлы отсортированы, комм по какой-то причине жалуется на несортированные файлы. Можно решить с помощью переключателя --nocheck-order.

Список можно отформатировать с помощью специального разделителя (см. Man comm).

Поскольку вы создали свой список, вы можете управлять им следующим образом:

readarray data < <(comm --nocheck-order --output-delimiter "-"  b.txt c.txt)
for ((i=0;i<${#data[@]};i++)); do
va=$(grep -e "-" <<<"${data[$i]}")
if [[ $va == "" ]]; then
    echo ${data[$i]} " null"
elif [[ $va == "--"* ]]; then 
        data2=$(echo ${data[$i]} | grep -Po '[0-9]*')
        echo $data2 " " $data2
else
    data2=$(echo ${data[$i]} | grep -Po '[0-9]*')
    echo "null " $data2
fi
done

Другие интересные команды - это join и sdiff, но ближе всего был comm. Также вы можете посмотреть в этом посте: { {1}} https://askubuntu.com/questions/515900/how-to-compare-two-files

С уважением

2
18.08.2016, 15:47
2 ответа

Вместо выполнения отдельной команды, возможно в цикле, для перемещения панелей после их создания, вы можете расширить команду задания, чтобы она перемещает свою собственную панель при запуске:

seq 1000 |
 parallel --jobs 9 --tmux tmux joinp -t :0 \; \
 tmux select-layout -t :0 tiled \; \
 sleep

Это покажет дополнительные команды tmux (а затем их вывод, упорядоченный в: tiled ) в каждой панели. Чтобы избежать этого, вы можете написать сценарий оболочки, например.

#!/bin/sh

# move into the pane set
tmux joinp -t :0
tmux select-layout -t :0 tiled >/dev/null

# start the real task
sleep "$@"

А затем запустите

seq 1000 | parallel --tmux --jobs 9 /path/to/wrapper.sh
1
27.01.2020, 22:10

Ваше предложение select-layout соответствует правильному пути, но его необходимо вызывать после открытия каждой новой панели. созданный. Все панели немедленно реорганизуются, поэтому (в моем тесте - терминал 95x58) достаточно места для следующего разделения.

Чтобы избежать сообщения не может присоединить панель к собственному окну , это помогает создать дополнительное окно, затем переместить в него все существующие окна и закрыть дополнительную панель в конце. parallel не подходит для этого - вам лучше запрашивать текущие окна и перемещать каждое из них в цикле:

top=$(tmux -S $SERVER new-window -P -n all)
tmux -S $SERVER list-panes -a | grep -v "^$top" | grep -o  "%[0-9]\+\>" | 
  while read p ; do 
    tmux -S $SERVER joinp -s $p -t $top
    tmux -S $SERVER select-layout tiled
  done
tmux -S $SERVER kill-pane -t $top
tmux -S $SERVER select-layout tiled 

В качестве альтернативы вы можете сделать каждую новую панель на 1 строку выше, с joinp -l 1 . В зависимости от размера вашего терминала этого может быть достаточно, чтобы в конце понадобился только один select-layout .

Однако parallel не отслеживает существующие tmux окна / панели, а просто запускает каждое задание в новом окне. Старый может исчезнуть, в зависимости от настройки остаться при выходе . Таким образом, через некоторое время исходное окно (которое показывало каждое задание на панели) не будет содержать запущенных заданий, и все новые задания снова будут в своих окнах. Вам придется повторно запустить скрипт, чтобы снова переместить все окна (и любые старые панели) в одно окно.

1
27.01.2020, 22:10

Теги

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