2012-04-18 95 views
1

鉴于下表,我想分别总结每一行,找出哪个是总计值的最高值和第二高值,并在相应的行中放置一个标记(例如,一个html标签,第一个加和值:<b>num1</b>和第二最高值:<i>num2</i>):带有标签最高值的标签

cat input.txt 
0.743745 0.00145661 
0.740159 0.00208729 
0.743907 0.0019944 
0.769515 0.0051214 
0.768735 0.00453603 
0.755945 0.00203796 

如果我们总结一下输入文件的每一行,我们将获得以下值:

0.7452 
0.7422 
0.7459 
0.7746 
0.7733 
0.7580 

给定这些计算值,所期望的输出应为:

cat output.txt 
0.743745 0.00145661 
0.740159 0.00208729 
0.743907 0.0019944 
<b>0.769515 0.0051214</b> 
<i>0.768735 0.00453603</i> 
0.755945 0.00203796 
+0

基本上创建具有和的新的数组,使用BC,AWK或该连结[ 1]进行浮动操作。在总结时使用2个其他变量来找出2个最大值。然后你知道原始数组中哪些行最大。但别指望别人写作业。 [1] http://www.linuxjournal.com/content/floating-point-math-bash – akostadinov 2012-04-18 13:01:26

+0

+1对于良好的格式化,样本输入,样本输出,问题描述,错误...示例代码?哦,不能拥有一切。祝你好运。 – shellter 2012-04-19 03:13:11

回答

1

见下文:

kent$ cat test 
0.743745 0.00145661 
0.740159 0.00208729 
0.743907 0.0019944 
0.769515 0.0051214 
0.768735 0.00453603 
0.755945 0.00203796 

kent$ awk '{a[NR]=$0;s=$1+$2; 
if(m==""||s>m){m=s;mr=NR; } 
if(n==""||(s>n&&s<m)){n=s;nr=NR;} } 
END{for(i=1;i<=NR;i++)if(i==mr) print "<b>"a[i]"</b>" 
     else if(i==nr) print "<i>"a[i]"</i>" 
     else print a[i]}' test 
0.743745 0.00145661 
0.740159 0.00208729 
0.743907 0.0019944 
<b>0.769515 0.0051214</b> 
<i>0.768735 0.00453603</i> 
0.755945 0.00203796 
+0

适用于所有awk解决方案!祝你们好运。 – shellter 2012-04-19 03:11:01

+0

@Kent,谢谢你的剧本。我用另一个文件,但它似乎是输出不是预期的。我使用的测试文件是:http://pastebin.com/DWar8k2Y你可以看看它吗? – Tin 2012-04-19 12:58:36

1
awk '{print NR"\t"$0"\t"$1+$2}' input.txt | 
    sort -k3gr | 
    sed -r -e '1s#\t(.*)\t#\t<b>\1</b>\t#' -e '2s#\t(.*)\t#\t<i>\1</i>\t#' | 
     sort -n | 
     cut -f2 

0.743745 0.00145661 
0.740159 0.00208729 
0.743907 0.0019944 
<b>0.769515 0.0051214</b> 
<i>0.768735 0.00453603</i> 
0.755945 0.00203796 
+0

+1用于分步格式化和有趣的使用unix(linux)工具箱功能来解决问题。祝你们好运。 – shellter 2012-04-19 03:12:10

+0

@kev,感谢您的插图。我用另一个输入文件测试了脚本,但我不确定它是否适用于所有情况,例如与此文件:http://pastebin.com/DWar8k2Y – Tin 2012-04-19 12:57:11