在循环中向可变日期添加年份

在循环中向可变日期添加年份

我有代码,我一次浏览每一行并获取第三列,即日期。

它以 format 形式回显日期04-04-2017。每行都有不同的日期,我希望从该日期起 5 年并将其放入新变量中,dob_want2但不断收到错误日期:

invalid date ‘'04-04-2017' -5 years’

该文件temp9_0.txt的格式为

123 5555 04-04-2017
126 1234 25-11-2014
218 0023 13-06-2002

echo "$dob_want"输出

04-04-2017

它显然无法识别$dob_want为日期。任何有关如何将此变量视为日期的帮助建议将不胜感激。

dob_want=$(head -1 temp9_0.txt | awk '{print $3}')
echo "$dob_want"
dob_want2=$(date  +%d-%m-%y -d "$dob_want -5 years")
echo "$dob_want2"

答案1

我不确定date您的情况是否需要该实用程序,因为您只想对年份执行相当简单的操作(减去 5 年仅意味着将yyyy的部分减少dd-mm-yyyy5)。

在这种情况下,以下awk程序将修改输入文件第三列中的日期:

~$ awk -v offs=-5 '{split($3,df,"-"); printf "%02d-%02d-%04d\n",df[1],df[2],df[3]+offs}' temp9_0.txt 
04-04-2012
25-11-2009
13-06-1997

通过将通过 as 变量指定的偏移量添加offs到第三列的第三个(破折号分隔的)子字段,并通过 打印修改后的子字段值printf。它通过使用split命令将第三列拆分到-数组中来实现这一点df日期字段)。

要将其应用于特定行而不是所有行,并假设没有空行,您可以指定一个附加变量,并通过评估, s 自动每文件行计数器line使程序仅选择该行:FNRawk

awk -v line=3 -v offs=-5 'FNR==line {split($3,df,"-"); printf "%02d-%02d-%04d",df[1],df[2],df[3]+offs}' temp9_0.txt

然后可以通过命令替换将该输出捕获到 shell 变量中,如下所示

dob_want2=$(awk -v line=3 .....)

相关内容