Bash 在AWK中使用和操作日期变量

Bash 在AWK中使用和操作日期变量,bash,date,awk,Bash,Date,Awk,我认为可能有更好的方法,但我唯一想到的是使用AWK 我有一个名称约定如下的文件: testfile\u 2016\u 03\u 01.txt 使用一个命令,我试图将其移动一天testfile\u 20160229.txt 我开始使用: file=testfile_2016_03_01.txt IFS="_" arr=($file) datepart=$(echo ${arr[1]}-${arr[2]}-${arr[3]} | sed 's/.txt//') date -d "$datepart

我认为可能有更好的方法,但我唯一想到的是使用AWK

我有一个名称约定如下的文件:

testfile\u 2016\u 03\u 01.txt

使用一个命令,我试图将其移动一天
testfile\u 20160229.txt

我开始使用:

file=testfile_2016_03_01.txt
IFS="_"
arr=($file)
datepart=$(echo ${arr[1]}-${arr[2]}-${arr[3]} | sed 's/.txt//')
date -d "$datepart - 1 days" +%Y%m%d
上面的工作很好,但我真的很想在AWK中完成。我唯一发现的是如何在AWK中使用“date”

new_name=$(echo ${file##.*} | awk -F'_' ' {
"date '+%Y%m%d'" | getline date;
print date
}')
echo $new_name
好吧,这里发生了两件事。由于某种原因,
$4
也包含
.txt
,即使我删除了它(?)
##。*

主要的问题是我不知道如何将变量传递到那个日期,下面的方法不起作用

`awk -F'_' '{"date '-d "2016-01-01"' '+%Y%m%d'" | getline date; print date}')

理想情况下,我希望
2016-01-01
成为来自文件名
$2-$3-$4
的变量,并在一天内进行减法运算,但我认为我在这里得到了太多的单引号和双引号,我的大脑正在失去..

等效
awk
命令:

file='testfile_2016_03_01.txt'
echo "${file%.*}" |
awk -F_ '{cmd="date -d \"" $2"-"$3"-"$4 " -1 days\"" " +%Y%m%d";
          cmd | getline date; close(cmd); print date}'

20160229

对于时间函数,使用GNU awk:

$ file=testfile_2016_03_01.txt
$ awk -v file="$file" 'BEGIN{ split(file,d,/[_.]/); print strftime(d[1]"_%Y%m%d."d[5],mktime(d[2]" "d[3]" "d[4]" 12 00 00")-(24*60*60)) }'
testfile_20160229.txt

这可能适合您:

file='testfile_2016_03_01.txt'
IFS='_.' read -ra a <<< "$file"
date -d "${a[1]}${a[2]}${a[3]} -1 day" "+${a[0]}_%Y%m%d.${a[4]}"
file='testfile\u 2016\u 03\u 01.txt'

IFS='.'.'read-ra a Remove from end:
${file%%.*}
而不是
##
(或者只有一个
%
,因为只有一个
)。你有或者你能得到GNU awk吗?谢谢BenjaminW,它能工作(虽然我不知道为什么没有,但我有不同的脚本)@EdMorton我有gawk yes
##
从一开始就删除匹配项,您可以使用它来获取扩展名或基名:
var='/abc/def/file.txt';回声“${var#*.}”;echo“${var##*/}”
返回
txt
file.txt
。作为一个符咒。谢谢