我遇到以下代码段的问题:
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
答案 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