对于菜单,我试图用printf拆分以下输出。 实际上,输出是在一列上完成的,目标是将输出分成20或30个元素的几列。
文本文件由以下将近100个项目组成:
item1
item2
item3
...
item98
item99
item100
这里是代码。我尝试了%-xxs,但没有成功。
LST_SRV_PSI=lst.txt
mapfile -t HOSTTAB < "$LST_SRV_PSI"
for i in ${!HOSTTAB[@]}; do
#printf "%3d%s) %s\n" $((i+1)) "${choices[i]:- }" "${HOSTTAB[i]}"
printf "%3d%s) %-10s\n" $((i+1)) "${choices[i]:- }" "${HOSTTAB[i]}"
done
我需要将这100个项目拆分为几列:
1 ) ITEM1
2 ) ITEM2
3 ) ITEM3
4 ) ITEM4
5 ) ITEM5
until
98 ) ITEM98
99 ) ITEM99
100 ) ITEM100
感谢您的帮助。
此致
答案 0 :(得分:0)
您可以使用此awk
:
awk -v n=5 '{
ORS = (NR % n ? "\t" : "\n"); $1 = sprintf("%02d ) %s", NR, $1)} 1' file
01 ) item1 02 ) item2 03 ) item3 04 ) item4 05 ) item5
06 ) item6 07 ) item7 08 ) item8 09 ) item9 10 ) item10
11 ) item11 12 ) item12 13 ) item13 14 ) item14 15 ) item15
16 ) item16 17 ) item17 18 ) item18 19 ) item19 20 ) item20
21 ) item21 22 ) item22 23 ) item23 24 ) item24 25 ) item25
在awk
命令中,您可以传递n=20
以每行打印20列,或传递n=30
以获取每行30列。
答案 1 :(得分:0)
我用|循环找到了另一种方法列。
我分享:
for i in ${!HOSTTAB[@]}; do
printf "%3d%s) %s\n" $((i+1)) "${choices[i]:- }" "${HOSTTAB[i]}"
echo ""
done | column