Arrays 如何在Bash中以类似拉链的方式合并两个数组?

Arrays 如何在Bash中以类似拉链的方式合并两个数组?,arrays,bash,zsh,Arrays,Bash,Zsh,我正在尝试以拉链式的方式将两个数组合并为一个数组。我很难做到这一点 array1=(one three five seven) array2=(two four six eight) 我尝试过嵌套for循环,但无法解决它。我不希望输出是13572468,而是12345678 我正在编写的实际脚本在这里()。。但它显然没有按预期的那样发挥作用。我要么打印整个array2(例如124683),要么只打印第一个索引,就像循环不起作用一样(例如12325272) 那么如何获得输出: one two t

我正在尝试以拉链式的方式将两个数组合并为一个数组。我很难做到这一点

array1=(one three five seven)
array2=(two four six eight)
我尝试过嵌套for循环,但无法解决它。我不希望输出是13572468,而是12345678

我正在编写的实际脚本在这里()。。但它显然没有按预期的那样发挥作用。我要么打印整个array2(例如124683),要么只打印第一个索引,就像循环不起作用一样(例如12325272)

那么如何获得输出:

one two three four five six seven eight
使用以上两个阵列


编辑:我可以用两个for循环和粘贴来解决这个问题。如果有人有更好的解决方案,那还是很有趣的。所以如果你有时间,请看一看

假设两个数组的大小相同

unset result
for (( i=0; i<${#array1[*]}; ++i)); do
    result+=( "${array1[$i]}" "${array2[$i]}" )
done
unset结果

对于((i=0;i我发现更常见的情况是我想将两个数组压缩到 两列。这不像“RTLinuxSW”答案那样是原生的Zsh,但是 对于这种情况,我使用粘贴

% tabs 16
% paste <(print -l $array1) <(print -l $array2)
one     two
three   four
five    six
seven   eight

您可以轻松地读取文件、创建包含其内容的数组、检查谁是较大的文件并进行循环

#!/usr/bin/env bash

## Writting a until d into the file file01 and writing 1 until 3 into the file file02.
echo {a..d} | tee file01
echo {1..3} | tee file02

## Declaring two arrays (FILE01 and FILE02) and a variable as integer.
declare -a FILE01=($(<file1))
declare -a FILE02=($(<file2))
declare -i COUNT=0

## Checking who is the biggest array and declaring the ARRAY_SIZE.
[[ "${#FILE01[@]}" -ge "${#FILE02[@]}" ]] && declare -i ARRAY_SIZE="${#FILE01[@]}" || declare -i ARRAY_SIZE="${#FILE02[@]}"

## Creating the loop (COUNT must be lesser or equal ARRAY_SIZE) and print each element of each array (FILE01 and FILE02).
while [ ${COUNT} -le ${ARRAY_SIZE} ]; do
  echo -n "${FILE01[$COUNT]} ${FILE02[$COUNT]} "
  ((COUNT++))
done
!/usr/bin/env bash
##将a直到d写入文件file01,将1直到3写入文件file02。
echo{a..d}tee file01
echo{1..3}| tee file02
##将两个数组(FILE01和FILE02)和一个变量声明为整数。
declare-a FILE01=($(它将变量声明为整数


${#FILE01[@]}
->用于获取数组大小

下面的解决方案设计用于处理由换行符分隔的数据:每个值在每个文件中的单独一行加载到数组中。工作方式与编写的完全相同,但如果数据的组织方式不同,请使用
查看@Socowi的备选方案>在注释中粘贴
printf
。非常感谢@Socowi提出了这个问题,并为以其他方式分隔的数据提供了解决方法!

下面是另一个从(2)个数组中交错数据的解决方案,这些数组由单独文件中的换行符分隔的数据填充。此解决方案使用
粘贴
回送
xargs

数组数据:我将文件馈送到数组,因为我喜欢从代码中分解数据。以下文件的每个值都由换行符分隔,这些文件将被
readarray
使用:

test1.txt

one
three
five
seven
two
four
six
eight
test2.txt

one
three
five
seven
two
four
six
eight
总而言之:

#!/bin/bash

readarray arrayTest1 < /root/test1.txt
readarray arrayTest2 < /root/test2.txt

paste <( echo "${arrayTest1[*]}" ) <( echo "${arrayTest2[*]}" ) | xargs
这是基于的,改进自的,它增加了对稀疏数组和关联数组的支持

for index in "${!array1[@]}"; do  # Also, quote indices
    result+=( "${array1[$index]}" "${array2[$index]}" )
done
之后:

$ echo "${result[@]}"
one two three four five six seven eight
$ declare -p result
declare -a result=([0]="one" [1]="two" [2]="three" [3]="four" [4]="five" [5]="six" [6]="seven" [7]="eight")

这假设两个数组的索引是相同的。

为什么需要嵌套for循环?一个循环级别就足够了:循环索引达到两个长度中较小的一个。@4ae1e1我想我可以设法让它这样工作。我需要循环来构建索引,就像我在解决方案中所做的那样。对不起,我没有阅读完整的脚本,特别是当它们是e可读性不强。不确定“构建索引”是什么意思。@4ae1e1第一个循环将输出温度和条件(例如10°C\u2601)。第二个循环将输出有效时间(例如10:00)。我使用循环将它们排列为我想要的正确格式。因此,我将有两个索引“列表”,可以说,我希望将它们放在一起。“两个‘列表’的索引”:我想大多数人都说元素有两个数组(“列表”很好,尽管在Bash speak中数组是正确的jagon)。一个“索引”是一个下标。你的意思是“构建数组”,而不是“构建索引”。请注意,这种方法假设索引从零到数组长度(减1)。由于Bash支持稀疏数组,因此这将不起作用。此外,它不适用于关联数组。若要迭代索引,请对${!array1[@]}
中的索引使用
。此外,您应该使用
[@]
而不是
[*]
作为一种习惯。后者如果被引用,会将数组变成一个字符串,由
$IFS
的第一个字符分隔。比较
(IFS=XYZ;a=(“红球”“蓝天”“绿草”);对于“${a[@]}”中的e;do echo“$((i++)$e”;done)
以星号而不是at符号表示相同。@暂停,谢谢!我发布了包含您的建议的帖子。使用
粘贴
是一个好主意。但目前的实现一点也不整洁。它假设每个条目都以换行符结尾,并且不包含空格或反斜杠。我认为下面的命令应该有效iably:
paste-zd'@Socowi非常感谢!我已经将您的反馈纳入了帖子中。非常感谢您抽出时间来制定一个适用于其他数据类型的替代解决方案!非常感谢您的所有反馈!