嵌套bash循环在同一行上打印两个数组



嗨,我创建了两个数组:

$ echo "${prot}"
abc
def
ghi
$ echo "${pos}"
123
456
789

其中prot中的元素n指的是pos中的元素,所以我想在一行上打印相应的元素,每对一行。

我尝试使用嵌套循环来实现这一点,在嵌套循环中,我通过换行符将各个数组拆分为元素:

for i in "${!prot[@]}";  do
    for j in "${!pos[@]}";  do
        IFS=$'n' read -a arr1 <<<"$i"
        IFS=$'n' read -a arr2 <<<"$j"
        echo $i $j  
    done
done

但这只给了我最后一双。这是一条很棒的线,但并不是全部打印出来的。我做错了什么?

预期输出:

$
    abc 123
    def 456
    ghi 789

我首先通过创建了阵列

    for i in *.fasta; do
    IFS=_-. read -ra arr <<<"$i"
    tmp=$(printf "${arr[*]: 0: 1} ${arr[*]: 1: 1} ${arr[*]: -2: 1}")
    fa+="$tmpn"
    done
   for i in "${fa[@]}"; do
   prot=$(echo -e "$i" | cut -d  -f 1)
   pos=$(echo -e "$i" | cut -d -f 2) 
   done

首先必须将字符串拆分为适当的bash数组:

readarray -t prot_array <<< "$prot"
readarray -t pos_array <<< "$pos"

然后,我会尝试类似的东西:

for ((i=0; i<${#prot_array[@]}; i++)); do
    echo "${prot_array[i]} ${pos_array[i]}";
done

这是一个没有嵌套循环的简单解决方案。${#prot[@]}是数组的大小。循环显示两个数组的相应元素。

另一种即使在处理不同长度的数组时也能工作的方法是简单地使用带有计数器变量的while循环并排输出数组,只要两个数组都有值:

#!/bin/bash
a1=( 1 2 3 4 5 )
a2=( a b c d e f g )
declare -i i=0
while [ "${a1[i]}" -a "${a2[i]}" ]; do
    printf " %s  %sn" "${a1[i]}" "${a2[i]}"
    ((i++))
done
exit 0

输出

$ bash arrays_out.sh
 1  a
 2  b
 3  c
 4  d
 5  e

相关内容

  • 没有找到相关文章

最新更新