您好我创建了两个数组:
$ echo "${prot}"
abc
def
ghi
$ echo "${pos}"
123
456
789
其中prot中的元素n指的是pos中的元素n。所以我想在一行上打印相应的元素,每对一个新行。
我试图用嵌套循环来做这个,我通过换行将各个数组拆分成元素:
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+="$tmp\n"
done
for i in "${fa[@]}"; do
prot=$(echo -e "$i" | cut -d\ -f 1)
pos=$(echo -e "$i" | cut -d\ -f 2)
done
答案 0 :(得分:2)
首先,您必须将字符串拆分为正确的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[@]}
是数组的大小。循环显示两个数组的相应元素。
答案 1 :(得分:0)
即使在处理不同长度的数组时,另一种方法就是使用带有计数器变量的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 %s\n" "${a1[i]}" "${a2[i]}"
((i++))
done
exit 0
<强>输出强>
$ bash arrays_out.sh
1 a
2 b
3 c
4 d
5 e