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

时间:2015-06-09 00:46:27

标签: arrays bash zsh

我正在尝试将两个数组合并为一个像拉链一样的时尚。我很难做到这一点。

window.onmousemove = function (e) {

    for (var i = 0; i < tooltips.length; i++) {
        var width = tooltips[i].offsetWidth;
        var x = (e.clientX - (width)/2) + 'px',
            y = (e.clientY - 40) + 'px';

        tooltips[i].style.top = y;
        tooltips[i].style.left = x;
    }
};

我尝试过使用嵌套的for循环,但无法解决这个问题。我不希望输出为13572468但是12345678。

我正在处理的实际脚本在这里(http://ix.io/iZR)..但它显然无法按预期工作。我要么打印整个array2(例如124683),要么只是第一个索引,就好像循环没有工作(例如12325272)。

那么如何获得输出:

array1=(one three five seven)
array2=(two four six eight)

以上两个数组?

编辑:我能够通过两个for循环和one two three four five six seven eight http://ix.io/iZU)来解决它。看看有人有更好的解决方案仍然会很有趣。所以,如果你有时间,请看看。

5 个答案:

答案 0 :(得分:7)

假设两个阵列的大小相同,

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

答案 1 :(得分:3)

我发现更常见的情况是我要将两个数组压缩成 两列。这不像“RTLinuxSW”答案那样本地Zsh,但是 对于这种情况,我使用粘贴。

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

然后可以将其推入另一个数组以获得预期的输出:

% array3=( `!!`«tab»«tab» )
% print $array3
one two three four five six seven eight

答案 2 :(得分:0)

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

#!/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

declare -a->它创建一个数组

declare -i->将var声明为整数

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

答案 3 :(得分:0)

此以下解决方案旨在与数据 以换行符分隔的 一起使用:将每个值加载到数组中的每个文件的单独一行中。完全可以按照书面形式正常运行,但是如果您的数据组织方式不同,请在注释中使用pasteprintf来使用 @Socowi 。非常感谢@Socowi提出问题并提供以其他方式分隔数据的解决方法!

这是另一种解决方案,可以交错(2)个数组中的数据,这些数组中填充了用换行符分隔的单独文件中的数据。此解决方案使用pasteechoxargs

数组数据:我将文件输入数组,因为我喜欢从代码中分解数据。以下每个文件值由换行符分隔的文件将由readarray使用:

test1.txt

one
three
five
seven

test2.txt

two
four
six
eight

将它们放在一起:

#!/bin/bash

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

paste <( echo "${arrayTest1[*]}" ) <( echo "${arrayTest2[*]}" ) | xargs

输出:

one two three four five six seven eight

答案 4 :(得分:0)

这是基于RTLinuxSWanswer的基础上,对Paused until further noticecomment的改进,它增加了对稀疏数组和关联数组的支持。

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")

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