我正在运行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"
?
答案 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
;结合cut
,paste
和流程替换,您会得到类似
paste -d ' ' \
<(date -f <(cut -d' ' -f1 infile) '+%d-%m-%Y') \
<(cut -d' ' -f2- infile)