我面对这种情况:
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
有人知道该怎么用才能到达那里?
答案 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
;
代码的组合