2016-09-28 58 views
0

以下脚本列出目录中的项目。它产生3个编号列的输出。编号的输出在列上从左到右水平列出。我反而希望将输出垂直列在第一列,然后是第二列,然后是第三列。我该如何做到这一点?如何垂直而不是水平地输出编号的列

脚本

#!/bin/bash 

menu=($(ls ${HOME})) 
i=0 
for m in ${menu[@]} 
do 
    echo "$((i++))) ${m}" 
done | xargs -L3 | column -t 

输出

0) item 1) item 2) item 
3) item 4) item 5) item 
6) item 7) item 8) item 
9) item 10) item 11) item 
12) item 13) item 14) item 

所需的输出

0) item 5) item 10) item 
1) item 6) item 11) item 
2) item 7) item 12) item 
3) item 8) item 13) item 
4) item 9) item 14) item 
+0

请参阅如果这能帮助,看起来你需要填充。 http://stackoverflow.com/questions/4409399/padding-characters-in-printf – Rao

回答

1

无需重写代码太多,这将工作:

#!/bin/bash 

menu=($(ls ${HOME})) 
totalRows=$((${#menu[*]}/3 + 1)) 
i=0 
for m in ${menu[@]} 
do  
    echo "$((i/3 + (i%3)*totalRows))) ${m}" 
    let i++ 
done | xargs -L3 | column -t 
1

,你也可以尝试SOMET像这样兴奋;

#!/bin/bash 
menu=(${HOME}/*) 
menLen=${#menu[@]} 
rowCounts=$(echo $(($menLen/3))) 
for ((c=0; c<$rowCounts; c++)) 
do 
findex=$c; 
sindex=$(echo $(($findex + $rowCounts))) 
tindex=$(echo $(($sindex + $rowCounts))) 
printf "%-40s \t %-40s \t %-40s \n" "$findex) ${menu[$findex]##*/}" "$sindex) ${menu[$sindex]##*/}" "$tindex) ${menu[$tindex]##*/}" 
done