如何使用 Linux 命令行工具格式化文件内容的日期?
输入:
aaa;1.70;ccc;20.01.13;zz;2013;
uuu;2.70;lll;17.12.10;zz;2013;
fff;3.70;nnn;31.01.98;zz;2013;
auu;8.70;nuu;30.02.96;zz;2013;
输出:
aaa;1.70;ccc;20.01.2013;zz;2013;
uuu;2.70;lll;17.12.2010;zz;2013;
fff;3.70;nnn;31;01.1998;zz;2013;
auu;8.70;nuu;30.02.1996;zz;2013;
答案1
假设 70 至 99 之间的任何两位数年份都是上个世纪的:
sed 's/[7-9][0-9];$/19&/; s/[0-6][0-9];$/20&/' file
或者,让别人决定:
perl -MTime::Piece -F';' -ane '
$F[-2] = Time::Piece->strptime($F[-2], "%d.%m.%y")->strftime("%d.%m.%Y");
print join(";", @F)
' file
选项
-MTime::Piece
导入标准 Perl时间::件模块-F';' -a
选项用分号分隔每行并将结果存储在@F
数组中-n
循环输入数据(标准输入或文件)中的行,而不自动打印每一行。
代码
$F[-2]
是个倒数第二字段(即您原始问题中的日期所在位置)。- 我使用
strptime
和strftime
方法来解析和格式化日期。
因此,如果您有需要更改第 12 至 15 列中的日期,请使用
perl -MTime::Piece -F';' -ane '
sub reformat {
return Time::Piece->strptime(shift, "%d.%m.%y")->strftime("%d.%m.%Y");
}
for my $i (11..14) {
$F[$i] = reformat $F[$i];
}
print join(";", @F)
' file
答案2
可以这样做awk
:
awk -F'[;.]' '{if ($6 <= 13) x=20$6; else x = 19$6 ; print \
$1";"$2";"$3";"$4"."$5"."x";"}'
此命令使用分隔符;
和来分隔字段.
。然后,它以这种方式修改最后一个字段:如果它小于或等于 13,则将其转换为20last_field
,否则将其转换为19last_filed
,然后它以与以前相同的顺序使用相同的分隔符打印字段,包括修改后的第六个字段(现在称为x
)。
答案3
使用dconv
日期工具:
dconv -Si '%d.%m.%y' -f '%d.%m.%Y' <<EOF
aaa;1.70;ccc;20.01.13;zz;2013;
uuu;2.70;lll;17.12.10;zz;2013;
fff;3.70;nnn;31.01.98;zz;2013;
auu;8.70;nuu;30.02.96;zz;2013;
EOF
产生您想要的输出。