Bash按列printf输出进行拆分

时间:2018-11-16 14:57:23

标签: bash awk split printf multiple-columns

对于菜单,我试图用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

感谢您的帮助。

此致

2 个答案:

答案 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