已解决:将两个变量与多行值并排组合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已解决:将两个变量与多行值并排组合相关的知识,希望对你有一定的参考价值。

从两个变量中获取两个列表,并排合并为一个变量。

假设您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

此外,这必须在没有文件输入或输出的情况下完成。我忘了补充,不要假设列表是静态的。实际上,假设相反,列表是动态的。也就是说,一个命令生成一个列表,而另一个生成另一列表。因此,问题的一部分是确保输出是同步的,尤其是与脚本错误的软件(如apt)同步。因为apt,aptitude和apt-rdepends都可以显示包和rdepends(可能是aptitude除外),所以有点混乱。它们的速度和等级各不相同,其中最容易出现错误。最好具有测试程序速度的功能(这三个函数中显示包或依赖关系最快的一个)。无论如何,我通过使用一个程序来获取依赖项(因此创建了静态列表)并使用另一个程序来显示软件包名称和大小来解决该问题。在我尝试同时列出rdepends和show之前,但是使用不同的命令会导致各种有趣的问题,包括sync :)我知道这是多么愚蠢。

如此处所承诺的那样,是脚本(第一个问题是本主题):

RDEPENDS版本

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

这两个脚本都能正常工作,但是可以更清晰地编写它们并进行优化以更快地工作。但是,这两个脚本仍在教导。另外,尽管我固定了脚本以使其起作用,但为了保持紧凑性,我选择不按照最初的要求放入两个列表中。由于命令最初是如何吐出输出的。

答案
var3=$(paste -d " " -- <(echo "$var1") <(echo "$var2"))

-d " "将分隔符设置为空格,而不是制表符。

另一答案

使用数组的纯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循环。

另一答案

您也可以使用pr

var3=$(pr -tm -s' ' <(printf '%s' "$var1") <(printf '%s' "$var2"))
  • -t->不打印标题
  • -m->合并文件
  • -s char->使用char作为分隔符

更简单地说,使用heredoc和-2选项表示两列输出:

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

另请参见:

以上是关于已解决:将两个变量与多行值并排组合的主要内容,如果未能解决你的问题,请参考以下文章

48个值得掌握的JavaScript代码片段(上)

R语言使用cowplot包的plot_grid函数将两个ggplot2可视化结果并排组合起来并添加图像标签AB设置组合图像使用共享的图例(shared legend in cowplot)

R语言ggplot2可视化:使用patchwork包将两个ggplot2可视化结果图像水平并排排列进行组合构图(combine plots side by side)

如何将两个单独表中的两列拆分为视图中的多行?

将十六进制 CSS 变量与 alpha 值组合

13 个非常有用的 Python 代码片段