Объедините две переменные с многострочными значениями рядом - PullRequest
0 голосов
/ 12 апреля 2020

Получите два списка из двух переменных и объедините их в одну переменную.

Предположим, вы echo "$var1" получите этот вывод:

a
b
c
d

Предположим, вы echo $var2 получите этот вывод:

1
2
3
4

Я хочу, чтобы $var3 имел такой точный вывод:

a 1
b 2
c 3
d 4

Как вы это делаете? И если вы спрашиваете, зачем мне это нужно, когда вы назначаете переменной команду или несколько команд, первая команда должна начинаться и заканчиваться, тогда вторая команда должна начинаться и заканчиваться так, чтобы varx=(command1 && command2) давал:

a
b
c
d
1
2
3
4

Также это должно быть выполнено без ввода или вывода файла. Я забыл добавить, не думайте, что списки stati c. Фактически, предположим обратное, списки являются динамическими c. То есть одна команда генерирует один список, а другая - другой. Так что отчасти проблема заключается в том, что выходные данные синхронизируются c, особенно с программным обеспечением с ошибками в скриптах, например, apt. Это немного сбивает с толку, потому что и apt, aptitude и apt-rdepends могут показывать пакеты и rdepends (кроме, возможно, aptitude). У них все разные скорости и уровни глючности, причем самые глючные. Было бы неплохо иметь функцию для проверки скорости программы (какая из 3 наиболее быстро показывает пакеты или зависимости). В любом случае, я обошел проблему, используя одну программу для извлечения зависимостей (поэтому создайте список stati c), а другую - для отображения имени и размера пакета. До того, как я пытался перечислять rdepends и показывать одновременно, но с разными командами, что приводило ко всевозможным забавным проблемам, включая syn c :) Я знаю, посмотрите, как это было глупо.

Как и было обещано здесь это сценарий (1-й был предметом этого вопроса):

RPEPENDS версия

ps -A &>> Distro1Analysis.txt && sudo service --status-all &>> Distro1Analysis.txt && \
for z in $(dpkg -l | awk '/^[hi]i/{print $2}' | grep -v '^lib'); do \
printf "\n$z:" && \
aptitude show $z | grep -E 'Uncompressed Size' && \
result=$(apt-rdepends 2>/dev/null $z | grep -v "Depends")
final=$(apt show 2>/dev/null $result | grep -E "Package|Installed-Size" | sed "/APT/d;s/Installed-Size: //");
if [[ (${#final} -le 700) ]]; then echo $final; else :; fi done &>> Distro1Analysis.txt

DEPENDS

ps -A &>> Distro1Analysis.txt && sudo service --status-all &>> Distro1Analysis.txt && \
for z in $(dpkg -l | awk '/^[hi]i/{print $2}' | grep -v '^lib'); do \
printf "\n$z:" && \
aptitude show $z | grep -E 'Uncompressed Size' && \
printf "\n" && \
apt show 2>/dev/null $(aptitude search '!~i?reverse-depends("^'$z'$")' -F "%p" | \
sed 's/:i386$//') | grep -E 'Package|Installed-Size' | sed '/APT/d;s/^.*Package:/\t&/;N;s/\n/ /'; done &>> Distro1Analysis.txt

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

Ответы [ 3 ]

2 голосов
/ 12 апреля 2020
var3=$(paste -d " " -- <(echo "$var1") <(echo "$var2"))

-d " " устанавливает символ пробела вместо табуляции.

1 голос
/ 12 апреля 2020

Вы также можете использовать pr :

var3=$(pr -tm -s' ' <(printf '%s' "$var1") <(printf '%s' "$var2"))
  • -t -> не печатать заголовок
  • -m -> объединять файлы
  • -s char -> использовать символ в качестве разделителя

Проще говоря, с помощью опции heredo c и -2 для обозначения вывода двух столбцов:

var3=$(pr -2ts' ' <<EOF
$var1
$var2
EOF
)

См. Также:

0 голосов
/ 12 апреля 2020

Чистое bash решение с использованием массивов:

$ var1=( a b c d )
$ var2=( 1 2 3 4 )
$ for ((i=0;i<${#var1[*]};++i)) { var3+=( "${var1[i]} ${var2[i]}" ); }
$ declare -p var3
declare -a var3=([0]="a 1" [1]="b 2" [2]="c 3" [3]="d 4")

... начиная со строк, вы можете конвертировать в массивы, например так:

$ var1string='a
b
c
d'
$ var2string='1
2
3
4'
$ IFSSAVE=$IFS
$ IFS=$'\n'  # use newline to split strings into arrays
$ var1=( $var1string )
$ var2=( $var2string )
$ IFS=$IFSSAVE

... и перейдите к for l oop из исходного решения для массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...