查找特定日期的最大值awk

时间:2016-09-17 08:47:37

标签: date awk date-format

我有一个包含多行的文件,每行包含以下数据 -

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

鉴于具体日期,如何提取当天价值最大的行的名称?

3 个答案:

答案 0 :(得分: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]具有该值。如果日期匹配且值大于先前看到的最大值,请将此值保存为新的最大值,并保存此行中的第一个字段以便在末尾打印。

答案 1 :(得分: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

答案 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

我希望无论如何都有帮助。

相关问题