2013-08-06 90 views
10

如何從文件中獲取最大「速率」和相應的「log2c」值如下? 例如:最大速率是89.5039,log2c 3.0。非常感謝。如何使用Linux bash shell腳本從文件中獲取最大數量

log2c=5.0 rate=88.7619 
log2c=-1.0 rate=86.5412 
log2c=11.0 rate=86.1482 
log2c=3.0 rate=89.5039 
log2c=-3.0 rate=85.5614 
log2c=9.0 rate=81.4302 
+1

在Awk中你沒有這樣做的原因嗎?這只是一個簡短的介紹性教程後應該是微不足道的。 – tripleee

+0

devnull的解決方案完美地工作在bash中。但是,我的輸入文件名是來自可變的$ filename。所以,我把這些文字放入回聲「...」|中SH。原諒我,我是一個新手。 – Eman

回答

12

使用sort

sort -t= -nr -k3 inputfile | head -1 

對於給定的輸入,它會返回:

log2c=3.0 rate=89.5039 

如果你想讀值到變量,您可以使用內置的read

$ IFS=$' =' read -a var <<< $(sort -t= -nr -k3 inputfile | head -1) 
$ echo ${var[1]} 
3.0 
$ echo ${var[3]} 
89.5039 
+0

然後,如何獲得89.5039和3.0,謝謝。 – Eman

+0

@ user79883請參閱上面的編輯。 – devnull

+0

或'IFS = $'='讀取未使用的log2c未使用率<<<「$(sort -t = -nr -k3 inputfile | head -1)」' – anishsane

4

對於非常大的文件,使用sort會很慢。在這種情況下,最好使用像awk中,它只需要一個通:

$ awk -F= 'BEGIN { max = -inf } { if ($3 > max) { max = $3; line = $0 } } END { print line }' test.txt 
log2c=3.0 rate=89.5039 

此操作的時間複雜度是線性的,而空間複雜度是恆定的(小)。說明:

  1. awk -F= '...' test.txt:調用上的test.txt awk中,使用=作爲字段分隔
  2. BEGIN { max = -inf }:初始化max的東西,永遠比你讀什麼小。
  3. { if ($3 > max) { max = $3; line = $0; } }:對於每個輸入線路,如果max小於第三字段($3)的值,然後更新它和記住當前行的值($0
  4. END { print line }:最後,打印線我們在閱讀輸入時記得。
+0

它不適用於我的Linux和最大與gawk 4.1.4,除非您將「print line」替換爲「print $ line」 –

相關問題