Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 如何使用awk从文本文件中的给定日期提取一个人的年龄并进行比较_Date_Awk_Extract - Fatal编程技术网

Date 如何使用awk从文本文件中的给定日期提取一个人的年龄并进行比较

Date 如何使用awk从文本文件中的给定日期提取一个人的年龄并进行比较,date,awk,extract,Date,Awk,Extract,我有一个文本文件,其中包含以下格式的几个字段。 姓名:电话:地址:出生日期:工资 出生日期的格式为mm/dd/yy。 我不知道如何从当前年份中减去特定人的出生年份来计算他们的年龄。我需要提取年龄,然后将其与特定年龄组(比如50岁)进行比较。我试过一些东西,但它给了我一些奇怪的数字,比如 awk-F:“{print$4-d}”d=$(date)”文件名您可以尝试: awk -F: -v year=$(date +"%Y") '{ split($4, dob, "/"); print $1, "is

我有一个文本文件,其中包含以下格式的几个字段。 姓名:电话:地址:出生日期:工资 出生日期的格式为mm/dd/yy。 我不知道如何从当前年份中减去特定人的出生年份来计算他们的年龄。我需要提取年龄,然后将其与特定年龄组(比如50岁)进行比较。我试过一些东西,但它给了我一些奇怪的数字,比如 awk-F:“{print$4-d}”d=$(date)”文件名

您可以尝试:

awk -F: -v year=$(date +"%Y") '{ split($4, dob, "/"); print $1, "is", year-dob[3], "years old" }' file.txt
编辑1:

要简单地打印60岁以下人士的列表,请尝试:

awk -F: -v year=$(date +"%Y") '{ split($4, dob, "/"); if (year-dob[3] <= 60) print $1 }' file.txt
script.awk的内容

BEGIN {
    FS=":"
    "date +\"%s\"" | getline cdate
}

{
    rdate = gensub(/([0-9]+)\/([0-9]+)\/([0-9]+)/, "\\3-\\1-\\2", "g", $4)
    cmd = "date -d " rdate " +\"%s\""

    while (( cmd | getline result ) > 0 ) {

        if ((cdate - result) / 31556926 <= 60) {
            print $1
        }
    }
}
开始{
FS=“:”
“日期+\%s\”获取行cdate
}
{
rdate=gensub(/([0-9]+)\/([0-9]+)\/([0-9]+)/,“\\3-\\1-\\2”,“g”,“4美元)
cmd=“日期-d”rdate”+\%s”
而((cmd | getline result)>0){
如果使用GNU awk((cdate-result)/31556926(应该可以工作,但未经测试,因为您没有提供任何示例输入和预期输出):

开始{
FS=“:”
nowSecs=systime()
nowYear=strftime(“%Y”,nowSecs)
nowDay=strftime(“%j”,nowSecs)
}
{
#输入日期格式为MM/DD/YY
dobSpec=gensub(/([0-9]+)\/([0-9]+)\/([0-9]+)/,“\\3\\1\\2 0 0 0”,“4美元)
dobSecs=mktime(“20”dobSpec)
如果((dobSecs>nowSecs)| |(dobSecs<0)){
#猜错了世纪,再试一次
dobSecs=mktime(“19”dobSpec)
}
dobYear=strftime(“%Y”,dobSecs)
dobDay=strftime(“%j”,dobSecs)
diffYears=nowYear-dobYear
diffDays=nowDay-dobDay
年龄=diffYears+(diffDays>=0?1:0)
如果(年龄<60岁){
打印
}
}
作为替代方案,@steve的解决方案在不使用对shell日期和后续getline的外部调用的情况下会是什么样子:

BEGIN {
    FS=":"
    cdate = systime()
}

{
    rdate = gensub(/([0-9]+)\/([0-9]+)\/([0-9]+)/, "\\3 \\1 \\2 0 0 0", "g", $4)
    result = mktime(rdate)

    if ((cdate - result) / 31556926 <= 60) {
       print $1
    }
}
开始{
FS=“:”
cdate=systime()
}
{
rdate=gensub(/([0-9]+)\/([0-9]+)\/([0-9]+)/,“\\3\\1\\2 0 0 0”,“g”,“4美元)
结果=mktime(rdate)

如果((cdate-结果)31556926,你需要包括关于年龄组的比较应该如何进行的细节。你如何定义一个年龄组?还要考虑增加一些样本数据和预期的输出。我需要列出60岁以下的人的答案。请告诉我,如果它已经回答了你的问题。史提夫。他为我工作,但我做的是dob[3],而不是dob[3],因为它给了我他们的出生年份,比如1949年或1963年。如果你能解释一下命令中的一些内容,那将非常有帮助(这只是为了我的理解,以便我将来可以处理类似的事情)因为我对shell脚本还不熟悉。例如,-v代表什么,它的作用是什么(date+“%Y”)我已经更新了我的答案;你想解释一下第二种方法吗?如果是的话,我将不得不稍后再做。HTH。你需要在上面添加一个世纪的猜测,因为输入年格式是yy而不是YYY。另外,因为你是假设gnu awk by gensub(),则无需调用shell的“date”并使用getline读取结果,因为时间函数已经内置到GNU awk中。我将更新我的答案,以演示与上面相同的方法,但不使用shell调用和getline。谢谢@EdMorton,这里有一些好的捕获。希望这能对OP的输入起作用!干杯。
BEGIN {
    FS=":"
    cdate = systime()
}

{
    rdate = gensub(/([0-9]+)\/([0-9]+)\/([0-9]+)/, "\\3 \\1 \\2 0 0 0", "g", $4)
    result = mktime(rdate)

    if ((cdate - result) / 31556926 <= 60) {
       print $1
    }
}
BEGIN{
   FS = ":"
   nowSecs  = systime()
   nowYear  = strftime("%Y",nowSecs)
   nowDay   = strftime("%j",nowSecs)
}

{
   # input date format is MM/DD/YY
   dobSpec = gensub(/([0-9]+)\/([0-9]+)\/([0-9]+)/, "\\3 \\1 \\2 0 0 0", "", $4)
   dobSecs = mktime("20" dobSpec)

   if ( (dobSecs > nowSecs) || (dobSecs < 0) ) {
      # guessed the wrong century so try again
      dobSecs = mktime("19" dobSpec)
   }

   dobYear = strftime("%Y",dobSecs)
   dobDay  = strftime("%j",dobSecs)

   diffYears = nowYear - dobYear
   diffDays  = nowDay  - dobDay

   age = diffYears + (diffDays >= 0 ? 1 : 0)

   if ( age < 60 ) {
      print
   }

}
BEGIN {
    FS=":"
    cdate = systime()
}

{
    rdate = gensub(/([0-9]+)\/([0-9]+)\/([0-9]+)/, "\\3 \\1 \\2 0 0 0", "g", $4)
    result = mktime(rdate)

    if ((cdate - result) / 31556926 <= 60) {
       print $1
    }
}