我有一個問題。假設我轉儲文件和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實現這個簡單的方法?而不是逐行拉出數字並循環尋找最大數量?
我有一個問題。假設我轉儲文件和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實現這個簡單的方法?而不是逐行拉出數字並循環尋找最大數量?
下面是我該怎麼做。我只是在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
希望。
假設有2個連字符是如圖所示的行格式之前「數字」:
cut -d- -f3- | sort -rn | sed '1{s/^[0-9]\+://; q}'
這是正確的嗎?
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’
附:我喜歡字段分隔符[:-]
你並不需要使用grep
。您可以直接在文件中使用awk
爲:
awk -F"[-:]" '/Foo/ && $3>prev{val=$NF;prev=$3}END{print val}' file
代碼awk:
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爲一個很好的方法。如果OP數據的最高值爲0或更小('foo name -1','foo name 0'等),那麼它會失敗,但這可能不是真正的問題,並且對於所選答案也是如此。 –
$ awk '{gsub(/.*:.|.$/,"")} (NR==1)||($NF>max){max=$NF; val=$0} END{print val}' file
foo name 3
這是很神祕的。你能解釋一下發生了什麼事嗎? –
這部分,你不明白,@PetreLamar? – Kent