2013-07-24 21 views
4

我有一個問題。假設我轉儲文件和FOO做grep和散發出來的結果是這樣的:如何使用AWK打印最高號線?

 
Foo-bar-120:'foo name 1' 
Foo-bar-130:'foo name 2' 
Foo-bar-1222:'foo name 3' 

等等

我要的是試圖提取使用人數最多foo的名稱。例如,在這種情況下,人數最多的是1222,我希望結果是foo name 3

有沒有用awk和sed實現這個簡單的方法?而不是逐行拉出數字並循環尋找最大數量?

回答

1

下面是我該怎麼做。我只是在Cygwin中測試了這個。希望它也能在Linux下工作。要把它放到一個文件,如mycommand

#!/usr/bin/awk -f 

BEGIN { 
     FS="-"; 
     max = 0; 
     maxString = ""; 
} 

{ 
     num = $3 + 0; # convert string to int 
     if (num > max) { 
       max = num; 
       split($3, arr, "'"); 
       maxString = arr[2]; 
     } 
} 

END { 
     print maxString; 
} 

然後使文件的可執行文件(chmod 755 mycommand)。現在,你可以管不管你通過它通過鍵入,例如,cat somefile | ./mycommand希望。

1

假設有2個連字符是如圖所示的行格式之前「數字」:

cut -d- -f3- | sort -rn | sed '1{s/^[0-9]\+://; q}' 
1

這是正確的嗎?

awk -F'[:-]' '{n=$(NF-1);if(n>m){v=$NF;m=n}}END{print v}' 

與您的數據:

kent$ echo "Foo-bar-120:’foo name 1’ 
Foo-bar-130:’foo name 2’ 
Foo-bar-1222:’foo name 3’"|awk -F'[:-]' '{n=$(NF-1);if(n>m){v=$NF;m=n}}END{print v}' 
’foo name 3’ 

附:我喜歡字段分隔符[:-]

+0

這是很神祕的。你能解釋一下發生了什麼事嗎? –

+0

這部分,你不明白,@PetreLamar? – Kent

0

你並不需要使用grep。您可以直接在文件中使用awk爲:

awk -F"[-:]" '/Foo/ && $3>prev{val=$NF;prev=$3}END{print val}' file 
3

代碼

awk -F[-:] '$3>a {a=$3; b=$4} END {print b}' file 

 
$ cat file 
Foo-bar-120:'foo name 1' 
Foo-bar-130:'foo name 2' 
Foo-bar-1222:'foo name 3' 

$ awk -F[-:] '$3>a {a=$3; b=$4} END {print b}' file 
'foo name 3' 
+1

+1爲一個很好的方法。如果OP數據的最高值爲0或更小('foo name -1','foo name 0'等),那麼它會失敗,但這可能不是真正的問題,並且對於所選答案也是如此。 –

1
$ awk '{gsub(/.*:.|.$/,"")} (NR==1)||($NF>max){max=$NF; val=$0} END{print val}' file 
foo name 3