2016-09-17 63 views
-3

的最大值我有一個文件有幾行,幷包含以下數據 -查找特定日期的awk

name 20150801|1 20150802|4 20150803|6 20150804|7 20150805|7 20150806|8 20150807|11532 20150808|12399 2015089|12619 20150810|12773 20150811|14182 20150812|27856 20150813|81789 20150814|41168 20150815|28982 20150816|24500 20150817|22534 20150818|3 20150819|4 20150820|47773 20150821|33168 20150822|53541 20150823|46371 20150824|34664 20150825|32249 20150826|29181 20150827|38550 20150828|28843 20150829|3 20150830|23543 20150831|6 

name2 20150801|1 20150802|4 20150803|6 20150804|7 20150805|7 20150806|8 20150807|11532 20150808|12399 2015089|12619 20150810|12773 20150811|14182 20150812|27856 20150813|81789 20150814|41168 20150815|28982 20150816|24500 20150817|22534 20150818|3 20150819|4 20150820|47773 20150821|33168 20150822|53541 20150823|46371 20150824|34664 20150825|32249 20150826|29181 20150827|38550 20150828|28843 20150829|3 20150830|23543 20150831|6 

管道分隔值每行表示每個在一個月中的日期值。 每行具有相同的格式和相同的列數。 第一列名稱表示該行的唯一名稱,例如20150818是yyyyddmm

給定一個特定的日期,如何提取當天具有最大價值的行的名稱?

+0

使用SQLite如果你能 – perreal

+0

後至少2對給定日期比較值的數據線。 –

+0

第一列名稱表示該行的唯一名稱。 20150818是yyyyddmm – joe

回答

1

我想你的意思是這樣的:

awk -v date=20150823 '{for(f=2;f<=NF;f++){split($f,a,"|");if(a[1]==date&&a[2]>max){max=a[2];name=$1}}}END{print name,max}' YourFile 

所以,你通過你正在尋找的日期在一個名爲date變量。然後遍歷該行上的所有字段,並將每個日期和值分割爲一個數組,使用|作爲分隔符 - a[1]具有日期,a[2]具有該值。如果日期匹配並且該值大於以前所見的任何最大值,請將其保存爲新的最大值,並保存此行的第一個字段以便在最後打印。

0

作爲一個快速&骯髒的解決方案,我們可以在下面的Unix執行此命令:

yourdatafile=<yourdatafile> 
yourdate=<yourdate> 

cat $yourdatafile | sed 's/|/_/g' | awk -F "${yourdate}_" '{print $1" "$2}' | sed 's/[0-9]*_[0-9]*//g' | awk '{print $1" "$2}' |sort -k 2n | tail -n 1 

有了下面的示例數據:

$ cat $yourdatafile 
Alice 20150801|44 20150802|21 20150803|7 20150804|76 20150805|71 
Bob 20150801|31 20150802|5 20150803|21 20150804|133 20150805|71 

yourdate=20150803我們得到:

$ cat $yourdatafile | sed 's/|/_/g' | awk -F "${yourdate}_" '{print $1" "$2}' | sed 's/[0-9]*_[0-9]*//g' | awk '{print $1" "$2}' |sort -k 2n | tail -n 1 
Bob 21 

yourdate=20150802我們得到:

$ cat $yourdatafile | sed 's/|/_/g' | awk -F "${yourdate}_" '{print $2" "$1}' | sed 's/[0-9]*_[0-9]*//g' | awk '{print $2" "$1}' | sort -k 2n | tail -n 1 
Alice 21 

的缺點是隻有一行印有當日的最高值超過一個名字爲實現可看出:

$ yourdate=20150805; cat $yourdatafile | sed 's/|/_/g' | awk -F "${yourdate}_" '{print $2" "$1}' | sed 's/[0-9]*_[0-9]*//g' | awk '{print $2" "$1}' | sort -k 2n | tail -n 1 
Bob 71 

我希望幫助反正。

1

你不可能花5秒鐘給你的樣本輸入不同的值嗎?無論如何,當針對實際的日期有不同的價值觀輸入運行這個可能工作:

$ cat tst.awk 
BEGIN { FS="[|[:space:]]+" } 
FNR==1 { 
    for (i=2;i<=NF;i+=2) { 
     if ($i==tgt) { 
      f = i+1 
     } 
    } 
    max = $f 
} 
$f >= max { max=$f; name=$1 } 
END { print name } 

$ awk -v tgt=20150801 -f tst.awk file 
name2