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
С уважением
Вместо выполнения отдельной команды, возможно в цикле, для перемещения панелей после их создания, вы можете расширить команду задания, чтобы она перемещает свою собственную панель при запуске:
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
Ваше предложение 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
окна / панели, а просто запускает каждое задание в новом окне. Старый может исчезнуть, в зависимости от настройки остаться при выходе . Таким образом, через некоторое время исходное окно (которое показывало каждое задание на панели) не будет содержать запущенных заданий, и все новые задания снова будут в своих окнах. Вам придется повторно запустить скрипт, чтобы снова переместить все окна (и любые старые панели) в одно окно.