簡體   English   中英

嵌套的bash循環在同一行上打印兩個數組

[英]nested bash loop to print two arrays on same line

嗨,我創建了兩個數組:

$ 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

首先,您必須將字符串拆分為適當的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  %s\n" "${a1[i]}" "${a2[i]}"
    ((i++))

done

exit 0

產量

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM