Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bash将日期转换为mysql格式_Bash - Fatal编程技术网

使用bash将日期转换为mysql格式

使用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

我面对这种情况:

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;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有所不同