在bash中使用`echo -e`丢失格式

时间:2014-10-26 06:36:35

标签: bash shell

我遇到以下代码段的问题:

while read line
do
     team1=`echo "${line% *}"`
     team2=`echo "${line#* }"`
     newline=`printf "%-8.2f\t%-8.2f\n" "$team1" "$team2"`
     #this line give perfect output
     # echo "$newline" 
     ##################problem is here########################
     final_list=("${final_list[@]}" "$newline")
     #########################################################
done <input.txt

#this line is losing all the formatting I gave
echo -e ${final_list[@]} | sort -t$'\t' -k1 -nr

这是我的输入文件

3.01 16.12
1.12 13.22
3.01 14.12 

我的预期输出是

1.12            13.22   
3.01            14.12   
3.01            16.12 

2 个答案:

答案 0 :(得分:3)

替换:

echo -e ${final_list[@]} | sort -t$'\t' -k1 -nr

使用:

printf "%s\n" "${final_list[@]}" | sort -t$'\t' -k1 -n

这实现了您的预期输出:

$ printf "%s\n" "${final_list[@]}" | sort -t$'\t' -k1 -n
1.12            13.22   
3.01            14.12   
3.01            16.12   

有两项必要的更改。首先,sort逐行工作,echo输出生成一行。其次,由于您希望的输出按升序进行数字排序,因此需要从-r中删除sort标记。

出了什么问题

这一行不符合人们的想法:

 newline=`printf "%-8.2f\t%-8.2f\n" "$team1" "$team2"`

问题是,当shell执行命令替换时,将删除任何尾随的换行符。因此,在将输出分配给\n之前,会删除printf格式的newline

这意味着当你到达这里时:

echo -e ${final_list[@]} 

没有换行符。 echo输出全部显示在一行上。

现在,考虑一下:

 #this line give perfect output
 # echo "$newline" 

这是有效的,因为echo会在输出中添加自己的换行符。

更简单的脚本

我不知道您的大项目的结构,但是,作为所提供代码的可能替代方案,请考虑:

while read team1 team2
do
     newline=$(printf "%-8.2f\t%-8.2f" "$team1" "$team2")
     final_list=("${final_list[@]}" "$newline")
done <input.txt
printf "%s\n" "${final_list[@]}" | sort -t$'\t' -k1 -n

更简单,但在大项目中可能没有帮助,将是重新格式化和排序input.txt的代码:

$ awk '{printf "%-8.2f\t%-8.2f\n",$1,$2}' input.txt |sort -n
1.12            13.22   
3.01            14.12   
3.01            16.12   

答案 1 :(得分:0)

使用sort -n对文件进行排序(如果需要,将其重定向到新文件,如&gt; newfile.txt并使用它)?

sort -n input.txt