我有代码,我一次浏览每一行并获取第三列,即日期。
它以 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-yyyy
5)。
在这种情况下,以下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
使程序仅选择该行:FNR
awk
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 .....)