将特定列上文件中的日期格式从+“%Y-%m-%d”转换为+“%d-%m-%Y”

时间:2019-06-05 16:36:11

标签: bash shell awk sed

我正在运行bash脚本,该脚本输出以下内容:

2019-06-05 08:30 99432434
2019-06-05 10:00 99432465
2019-06-05 11:00 97987567
2019-06-05 12:00 97433556
2019-06-05 13:15 96844558
2019-06-05 17:00 97091234
2019-06-05 18:00 96764765
2019-06-05 19:00 99878787

我想将第一列中的日期格式转换为这样:

05-06-2019 08:30 99432434
05-06-2019 10:00 99432465
05-06-2019 11:00 97987567
05-06-2019 12:00 97433556
05-06-2019 13:15 96844558
05-06-2019 17:00 97091234
05-06-2019 18:00 96764765
05-06-2019 19:00 99878787

所以基本上它必须变成+"%d-%m-%Y",而现在变成+"%Y-%m-%d"

我尝试将命令的输出通过管道传递到此:

while read -r line; do echo $(date -d "$line" +%Y-%m-%d); done

但是它遍历整个文件,结果是这样:

date: invalid date 2019-06-06 08:30 99432434
date: invalid date 2019-06-06 10:00 99432465
date: invalid date 2019-06-06 11:00 97987567
date: invalid date 2019-06-06 12:00 97433556
date: invalid date 2019-06-06 13:15 96844558
date: invalid date 2019-06-06 17:00 97091234
date: invalid date 2019-06-06 18:00 96764765
date: invalid date 2019-06-06 19:00 99878787

如何将第一列的日期格式更改为+"%d-%m-%Y"

4 个答案:

答案 0 :(得分:1)

由于格式是固定的,因此您可以取消日期操作,而只需使用awk即可将周围的字段改编:

awk -F'[- ]' '{ print $3"-"$2"-"$1" "$4" "$5 }' file

输出

05-06-2019 08:30 99432434
05-06-2019 10:00 99432465
05-06-2019 11:00 97987567
05-06-2019 12:00 97433556
05-06-2019 13:15 96844558
05-06-2019 17:00 97091234
05-06-2019 18:00 96764765
05-06-2019 19:00 99878787

答案 1 :(得分:1)

使用任何sed:

$ sed 's/\(....\)\(....\)\(..\)/\3\2\1/' file
05-06-2019 08:30 99432434
05-06-2019 10:00 99432465
05-06-2019 11:00 97987567
05-06-2019 12:00 97433556
05-06-2019 13:15 96844558
05-06-2019 17:00 97091234
05-06-2019 18:00 96764765
05-06-2019 19:00 99878787

答案 2 :(得分:0)

将第一列读入一个变量(下面的$d),将其余列读入另一个变量(下面的$rest):

while read -r d rest; do echo $(date -d "$d" +%d-%m-%Y) $rest; done

答案 3 :(得分:0)

如果您有GNU date,则可以使用-f选项从文件中读取多个日期,然后仅调用一次date;结合cutpaste和流程替换,您会得到类似

paste -d ' ' \
    <(date -f <(cut -d' ' -f1  infile) '+%d-%m-%Y') \
    <(cut -d' ' -f2- infile)