将shell编写的文本文件的一部分制成表格

将shell编写的文本文件的一部分制成表格,shell,Shell,我有一个shell脚本,它将数组上的输出写入(回显)文件。该文件的格式如下 The tansaction detials for today are 35 Please check the 5 biggest transactions below ----------------------------------------------------------------------------------- Client Name,Account Number,Amo

我有一个shell脚本,它将数组上的输出写入(回显)文件。该文件的格式如下

The tansaction detials for today are 35 

    Please check the 5 biggest transactions below   

-----------------------------------------------------------------------------------


Client Name,Account Number,Amount,Tran Time
Michael Press,20484,602117,11.41.02
Adam West,164121,50152,11.41.06
John Smith,15113,411700,11.41.07
Leo Anderson,2115116,350056,11.41.07
Wayne Clark,451987,296503,11.41.08
我有多条这样的线路

我怎样把名字排在-----之后? 我尝试在回显数组元素时使用空格。还尝试了标签。我尝试使用
column-t-s
选项。但是---上面的文本干扰了期望的输出

所需输出为

The tansaction detials for today are 35 

    Please check the 5 biggest transactions below   

-----------------------------------------------------------------------------------


Client Name   Account Number   Amount  Tran Time
Michael Press 20484            602117  11.41.02
Adam West     164121           50152   11.41.06
John Smith    15113            411700  11.41.07
Leo Anderson  2115116          350056  11.41.07
Wayne Clark   451987           296503  11.41.08
打印到文件是更大脚本的一部分。因此,我正在寻找一个简单的解决方案来插入这个脚本。 这是我回显文件的脚本的片段

echo "The tansaction detials for today are 35 " >> log.txt
echo "" >> log.txt
echo "  Please check the 5 biggest transactios below   " >> log.txt
echo "" >> log.txt
echo "-----------------------------------------------------------------------------------" >> log.txt
echo "" >> log.txt
echo "" >> log.txt
echo "Client Name,Account Number,Amount,Tran Time" >> log.txt
array=( `output from a different script` )
x=1
for i in ${array[@]}
do

        #echo "Array $x - $i"
        Clientname=$(echo $i | cut -f1 -d',')
        accountno=$(echo $i | cut -f2 -d',')
        amount=$(echo $i | cut -f3 -d',')
        trantime=$(echo $i | cut -f4 -d',')

echo "$Clientname,$accountno,$amount,$trantime" >> log.txt
(( x=$x+1 ))
done

如果我理解您的问题,为了生成以下输出格式:

Client Name   Account Number   Amount  Tran Time
Michael Press 20484            602117  11.41.02
Adam West     164121           50152   11.41.06
John Smith    15113            411700  11.41.07
Leo Anderson  2115116          350056  11.41.07
Wayne Clark   451987           296503  11.41.08
您应该使用
printf
提供的输出格式,而不是
echo
。例如,对于标题,您可以使用:

printf "Client Name   Account Number   Amount  Tran Time\n" >> log.txt
而不是:

echo "Client Name,Account Number,Amount,Tran Time" >> log.txt
echo "$Clientname,$accountno,$amount,$trantime" >> log.txt
要写出五个最大金额和详细信息,您可以使用:

printf "%-14s%-17s%8s%s\n" "$Clientname" "$accountno" "$amount" "$trantime" >> log.txt
而不是:

echo "Client Name,Account Number,Amount,Tran Time" >> log.txt
echo "$Clientname,$accountno,$amount,$trantime" >> log.txt
如果这不是你需要的,只需发表评论,让我知道,我很乐意进一步帮助你

(您可能需要稍微调整字段宽度,我只是粗略地计算了一下)


真正的表格输出需要测量每个字段

如果要确保数据始终以表格形式显示,则需要测量每个字段的宽度(包括标题),然后取字段宽度(或标题)的最大值来设置输出的字段宽度。下面是一个如何做到这一点的示例(使用模拟的其他程序输入):


请仔细查看,如果您有任何问题,请告诉我。

如果我理解您的问题,以便生成以下内容的输出格式:

Client Name   Account Number   Amount  Tran Time
Michael Press 20484            602117  11.41.02
Adam West     164121           50152   11.41.06
John Smith    15113            411700  11.41.07
Leo Anderson  2115116          350056  11.41.07
Wayne Clark   451987           296503  11.41.08
您应该使用
printf
提供的输出格式,而不是
echo
。例如,对于标题,您可以使用:

printf "Client Name   Account Number   Amount  Tran Time\n" >> log.txt
而不是:

echo "Client Name,Account Number,Amount,Tran Time" >> log.txt
echo "$Clientname,$accountno,$amount,$trantime" >> log.txt
要写出五个最大金额和详细信息,您可以使用:

printf "%-14s%-17s%8s%s\n" "$Clientname" "$accountno" "$amount" "$trantime" >> log.txt
而不是:

echo "Client Name,Account Number,Amount,Tran Time" >> log.txt
echo "$Clientname,$accountno,$amount,$trantime" >> log.txt
如果这不是你需要的,只需发表评论,让我知道,我很乐意进一步帮助你

(您可能需要稍微调整字段宽度,我只是粗略地计算了一下)


真正的表格输出需要测量每个字段

如果要确保数据始终以表格形式显示,则需要测量每个字段的宽度(包括标题),然后取字段宽度(或标题)的最大值来设置输出的字段宽度。下面是一个如何做到这一点的示例(使用模拟的其他程序输入):


仔细检查一下,如果你有任何问题,请告诉我。

我不确定什么都懂

但要回答这个问题:

我怎样把名字排在-----之后

-e表示:启用反斜杠转义的解释

因此,对于您的输出,我建议:

echo -e "$Clientname\t$accountno\t$amount\t$trantime" >> log.txt
编辑:如果您需要更多空间,可以翻倍、三倍,。。。它

echo -e "Example1\t\tExample2"

我不确定什么都懂

但要回答这个问题:

我怎样把名字排在-----之后

-e表示:启用反斜杠转义的解释

因此,对于您的输出,我建议:

echo -e "$Clientname\t$accountno\t$amount\t$trantime" >> log.txt
编辑:如果您需要更多空间,可以翻倍、三倍,。。。它

echo -e "Example1\t\tExample2"

这不起作用,因为数组中有些行更长,有些行更短。因此,仅仅用空格分隔它们并不能精确地将其制成表格。这就是为什么我说您可能需要将字段宽度修饰符调整为该字段的最长字符串。您可以将字段宽度作为参数提供给每个
printf
转换说明符(例如
%*s
,然后传递
printf“%*s…”“$width”$field”
(按该顺序)可以容纳任何长度的字段。这是处理表格输出的一种非常灵活的方法。您知道可以使用
${varname}
获得每个字段的最大宽度,例如
${Clientname}
我尝试了不同宽度的字段,但输出仍然不美观。我的意思是我可以将字段分开,但它们仍然不是一条直线。以上只是一个示例。我有很多不同长度的行。我发现printf选项没有问题。输出的文本文件非常完美。问题发生了当我发送这个文本文件时,我只是在做
/bin/mail/-s“主题”email@email.com
。这会弄乱格式。嗯,除非在其他一些行中使用
选项卡
字符(例如
'\t'
),否则肯定不会发生这种情况。(或者还有一些其他的控制字符以某种方式被写入了
log.txt
)。我不知道你在使用哪个
mail
程序(我推荐
nails
,它是
传家宝mailx
的延续)“
选项卡的问题在于,它们的处理方式与邮件程序处理它们的方式一样多。请查看是否可以让
log.txt
只包含
空格和
文本,并查看问题是否消失。这不起作用,因为数组中有些行较长,有些行较短。”所以,仅仅用空格分隔它们并不能精确地将其制成表格。这就是为什么我说您可能需要将字段宽度修饰符调整为该字段的最长字符串。您可以将字段宽度作为参数提供给每个
printf
转换说明符(例如
%*s
,然后传递
printf%*s.“$width”“$field”
(按该顺序)以容纳任何长度的字段。这是处理表格输出的一种非常灵活的方法。您知道,您可以使用
${varname}
获得每个字段的最大宽度,例如
${Clientname}
我尝试了不同宽度的字段,但输出仍然不理想。我的意思是我可以将字段分开,但它们仍然不是一条直线。以上只是一个示例。我