将数组更改为表bash脚本

时间:2014-08-25 20:34:40

标签: bash

如何将数组更改为表格形式?

例如:

array = 1 2 3 4 5 6 7 8 9 10 11 12

结果

 1 10 11
 2 9  12
 3 8  
 4 7
 5 6 

以此特定顺序向上 - 向下 - 向上 - 向下

数组来自.txt文件,它基于用户输入,因此值不同

这是我的一些代码

declare -a myarray
# Load file into array.
readarray myarray < temp2.txt
s=$myarray
f  or i in $(seq 0 $((${#s} - 1))); do
        echo "s[$i] = \"${s:$i:1}\""
done

4 个答案:

答案 0 :(得分:2)

此脚本可以满足您的需求:

#!/bin/bash

a=( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 )
rows=5

for (( j=0; j<rows; ++j )); do 
    for (( i=0; i<=$(( ${#a[@]} / rows )); ++i )); do        
        if (( i%2 )); then idx=$(( (i + 1) / 2 * 2 * rows - j - 1 ))
        else idx=$(( (i / 2) * 2 * rows + j )); fi
        printf "%-4s" "${a[idx]}"
    done
    printf "\n"
done

输出:

1   10  11      
2   9   12      
3   8   13  18  
4   7   14  17  
5   6   15  16 

要让它从左到右而不是从上到下工作,您只需简单地交换ij循环(并将名称rows更改为{{1所以它仍然有意义):

cols

输出:

#!/bin/bash

a=( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 )
cols=5

for (( i=0; i<=$(( ${#a[@]} / cols )); ++i )); do        
    for (( j=0; j<cols; ++j )); do 
        if (( i%2 )); then idx=$(( (i + 1) / 2 * 2 * cols - j - 1 ))
        else idx=$(( (i / 2) * 2 * cols + j )); fi
        printf "%-4s" "${a[idx]}"
    done
    printf "\n"
done

答案 1 :(得分:0)

declare -a s
s=(1 2 3 4 5 6 7 8 9 10 11 12)

ofstabled=(9 7 5 3 1)
ofstableu=(1 3 5 7 9)
for ((i=0; i<5;++i)); do
    for ((j=$i; j<${#s[@]};)); do
        printf "%d " ${s[$j]}
    let j=$j+${ofstabled[$i]}
    if [ $j -lt ${#s[@]} ]; then
        printf "%d " ${s[$j]}
        let j=$j+${ofstableu[$i]}
    fi
    done
    printf "\n"
done

如果你愿意,你可以提高它,但它有效。

答案 2 :(得分:0)

脚本:

#!/bin/bash

a=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18)
rows=${1:-5}

col=()
for ((i = 0; i < ${#a[@]}; i++)); do
    ((ind=i % rows))
    (( ((i / rows) % 2 == 0) && (ind = ((rows - 1) - ind)) ))
    [ -n "${col[(rows - 1) - $ind]}" ] && col[(rows - 1) - $ind]+=" "
    col[(rows - 1) - $ind]+=${a[$i]}
done

printf %s\\n "${col[@]}" | column -t

输出:

$ ./order.sh
1  10  11
2  9   12
3  8   13  18
4  7   14  17
5  6   15  16

$ ./order.sh 3
1  6  7  12  13  18
2  5  8  11  14  17
3  4  9  10  15  16

感谢@TomFenech的灵感,使行数可以控制。

答案 3 :(得分:0)

您可以使用awk从文件中读取并按照您希望的方式进行打印:

$ awk '{
    if(NR<=5) {
        a[NR]=$0
        next
    } else {
        row=NR%10
    }
}
!(row in a) {
    if(row == 0)
        row++
    else
        row=5 - (NR % 5) + 1
}
{
    a[row]=a[row] FS $0
}
END {
    for(i in a)
        print a[i]
}' file
1 10 11
2 9 12
3 8
4 7
5 6