2016-09-17 93 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