使用bash将日期转换为mysql格式
我面对这种情况: foo.csv使用bash将日期转换为mysql格式,bash,Bash,我面对这种情况: foo.csv blabla;01/01/2014;13:03:11;01/02/2014;14:16:58 因此,前两个字段对应于开始日期:2014年1月1日;13:03:11 最后两个字段对应于结束日期:2014年2月1日;14:16:58 最后,我希望获得: blabla;2014-01-01 13:03:11;2014-02-01 14:16:58 有人知道用什么来达到目的吗?line=“blabla;01/01/2014;13:03:11;01/02/2014;1
blabla;01/01/2014;13:03:11;01/02/2014;14:16:58
因此,前两个字段对应于开始日期:2014年1月1日;13:03:11
最后两个字段对应于结束日期:2014年2月1日;14:16:58
最后,我希望获得:
blabla;2014-01-01 13:03:11;2014-02-01 14:16:58
有人知道用什么来达到目的吗?line=“blabla;01/01/2014;13:03:11;01/02/2014;14:16:58”
line="blabla;01/01/2014;13:03:11;01/02/2014;14:16:58"
OLD_IFS="$IFS" # Save old value of $IFS
IFS=";"
read blah start_date start_time end_date end_time <<<$line
IFS="/"
read month day year <<<$start_date
start_date="$year-$month-$day
read month day year <<<$end_date
end_date="$year-$month-$day"
IFS="$OLD_IFS"
echo "$blah;$start_date;$start_time;$end_date;$end_time"
OLD_IFS=“$IFS”#保存$IFS的旧值
IFS=“;”
阅读blah start_date start_time end_date end_time您可以使用awk
进行此类格式设置:
$ awk '
BEGIN {FS = OFS = ";" }
{
split($2, d, /\//)
$2 = d[3]"-"d[2]"-"d[1]" "$3
split($4, d, /\//)
$3 = d[3]"-"d[2]"-"d[1]" "$5
$0 = $1 FS $2 FS $3
}1' file
blabla;2014-01-01 13:03:11;2014-02-01 14:16:58
说明:
- 我们将输入和输出字段分隔符设置为
代码>
split
函数将第二个字段(数组中的日期)拆分为一个数组,以便我们可以重新组织它。我们将下一个字段的时间填充到此字段李>
- 我们在下一个日期执行类似的操作
- 我们重新构建了整个生产线,以承载新的三个领域
1
允许我们打印新的格式化行李>
如果使用Perl oneliner没有问题,请尝试以下方法:
cat input.txt | perl -lne '($a,$b,$c,$d,$e) = /^([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)$/g; $b =~ s|(\d\d?)/(\d\d?)/(\d{4})|$3-$2-$1|g; $d =~ s|(\d\d?)/(\d\d?)/(\d{4})|$3-$2-$1|g; print "$a;$b $c;$d $e";'
或者直接将输入文件(请参见命令末尾)推送到Perl
perl -lne '($a,$b,$c,$d,$e) = /^([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)$/g; $b =~ s|(\d\d?)/(\d\d?)/(\d{4})|$3-$2-$1|g; $d =~ s|(\d\d?)/(\d\d?)/(\d{4})|$3-$2-$1|g; print "$a;$b $c;$d $e";' input.txt
这基本上是几行由分隔的Perl
代码的组合代码>是否可以将输出重定向到具有此语法的文件?@musecz-yes。只需在命令末尾使用>output.txt
将其重定向到另一个文件中即可。感谢您的支持:)我认为它与perl有所不同