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

时间:2014-03-20 21:27:54

标签: bash

我面对这种情况:

foo.csv

blabla;01/01/2014;13:03:11;01/02/2014;14:16:58

因此,两个第一个字段对应于开始日期:01/01/2014;13:03:11

最后两个字段对应于结束日期:01/02/2014;14:16:58

最后我想获得:

blabla;2014-01-01 13:03:11;2014-02-01 14:16:58

有人知道该怎么用才能到达那里?

3 个答案:

答案 0 :(得分:1)

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"

$IFS代表输入文件分隔符。它在read语句中用于确定输入中断。它通常默认为空格,标签为Newline,但您可以更改它。

我首先将其设置为;,因此我可以将分号分开的输入分开。我有$start_date$end_date之后,我将IFS设置为/,这是我日期字符串的分隔符。然后我重新格式化我的日期,并将IFS重置为其原始值。

答案 1 :(得分:1)

您可以使用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允许我们打印新格式化的行。

答案 2 :(得分: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

分隔的几行;代码的组合