2012-04-18 228 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