在列中打印文本变量

时间:2013-11-16 03:28:05

标签: bash printf echo

我试图在列中并排打印两个变量的内容。我希望列的宽度为显示的50%:width=$(($(tput cols)/2)),并且行应该在空格上打破;不是在言语的中间。这两个变量都有相当多的文本:

变量1:

  

Lorem ipsum dolor坐下来,精神上的精神。 Donec a diam   lectus。 Sed坐在amet ipsum mauris。 Maecenas认为ligula ac quam   viverra nec consectetur ante hendrerit。 Donec et mollis dolor。   Praesent et diam eget libero egestas mattis sit amet vitae augue。

变量2:

  

Nam tincidunt congue enim,ut porta lorem lacinia consectetur。 Donec ut libero sed arcu vehicula ultricies a non tortor。 Lorem ipsum   dolor sit amet,consectetur adipiscing elit。 Aenean ut gravida lorem。   Ut turpis felis,pulvinar a semper sed,adipiscing id dolor。

预期结果:

Lorem ipsum dolor sit amet,      Nam tincidunt congue enim,
consectetur adipiscing elit.     ut porta lorem lacinia
Donec a diam lectus. Sed sit     consectetur. Donec ut libero
amet ipsum mauris. Maecenas      sed arcu vehicula ultricies
congue ligula ac quam viverra    a non tortor. Lorem ipsum
nec consectetur ante             dolor sit amet, consectetur
hendrerit. Donec et mollis       adipiscing elit. Aenean ut
dolor. Praesent et diam eget     gravida lorem. Ut turpis
libero egestas mattis sit        felis, pulvinar a semper
amet vitae augue.                sed, adipiscing id dolor.

这是我最接近列的行,但是长行不符合列的限制:

column=`tput cols`
column=$(($column/2))
printf "sometext%${column}[ $(echo -en "\033[1;31m")FAILED$(echo -en "\033[0m") ]\r$i\n"

我还查看了columnfmtdiff,但他们使用的是文件;不是变量。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

此函数按顺序采用四个参数:

  • 宽度
  • 排水沟
  • 左栏文字
  • 右栏文字

装订线是列之间的最小间距。由于线条在空间处断裂,实际的排水沟可能会更宽。

columnate() {
  paste <(fmt -w$1 <<<"$3") <(fmt -w$1 <<<"$4") | expand -t $(($1 + $2))
}

示例:

$ c1="Lorem ipsum dolor
sit amet, consectetur adipiscing elit.
Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas
congue ligula ac quam
viverra nec consectetur ante hendrerit. Donec et
mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue."
$ c2="Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut
libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet,
consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis,
pulvinar a semper sed, adipiscing id dolor."
$ columnate 39 2 "$c1" "$c2"
Lorem ipsum dolor sit amet,              Nam tincidunt congue enim, ut porta
consectetur adipiscing elit.             lorem lacinia consectetur. Donec ut
Donec a diam lectus. Sed sit amet        libero sed arcu vehicula ultricies
ipsum mauris. Maecenas congue ligula     a non tortor. Lorem ipsum dolor
ac quam viverra nec consectetur          sit amet, consectetur adipiscing
ante hendrerit. Donec et mollis          elit. Aenean ut gravida lorem. Ut
dolor. Praesent et diam eget libero      turpis felis, pulvinar a semper sed,
egestas mattis sit amet vitae augue.     adipiscing id dolor.

fmtexpand是GNU coreutils的一部分。 paste是Posix标准。

答案 1 :(得分:1)

丑陋,但符合要求,是一种普遍需求的“单线”解决方案: - )

paste <(echo "$fileA") <(echo "$fileB") | awk -F"\t" '{printf("%-40s\t%-40s\n", $1, $2)}'


orem ipsum dolor sit amet,                      Nam tincidunt congue enim,
consectetur adipiscing elit.                    ut porta lorem lacinia
Donec a diam lectus. Sed sit                    consectetur. Donec ut libero
amet ipsum mauris. Maecenas                     sed arcu vehicula ultricies
congue ligula ac quam viverra                   a non tortor. Lorem ipsum
nec consectetur ante                            dolor sit amet, consectetur
hendrerit. Donec et mollis                      adipiscing elit. Aenean ut
dolor. Praesent et diam eget                    gravida lorem. Ut turpis
libero egestas mattis sit                       felis, pulvinar a semper
amet vitae augue.                               sed, adipiscing id dolor.

其中fileA和fileB匹配您的变量1和2值。

分解各个部分并更改printf(...)中的值。看看它是如何运作的“单线”。

您可以使用awk变量传递从列派生的宽度值,例如

 awk -F"\t" -v colwidth="$colWidth" '{printf("%-"colWidth"s\t%-"colWidth"\n", ...}'` 

暂时上床睡觉。其他人可以根据需要加入。祝好运。 : - )

IHTH。