繁体   English   中英

Bash按列printf输出拆分

[英]Bash Split by column printf output

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

谢谢你的帮助。

问候,

您可以使用以下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列。

我用|循环找到了另一种方法 柱。

我分享:

for i in ${!HOSTTAB[@]}; do
    printf "%3d%s) %s\n" $((i+1)) "${choices[i]:- }" "${HOSTTAB[i]}"
    echo ""
done | column

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM