Bash修改CSV来改变一个字段

我有一个非常大的CSV文件(aprox 10.000行和400列),我需要修改某些列(如20140321132233 )将格式从20140321132233更改为2014-03-21 13:22:33 。 我需要修改的所有字段都是date时间。

我看到一些使用awk的例子,但用于math修改。 我可以使用这样的东西做上述改变吗?

file.csv例子:

 19238328932|123233443|123|0|||||123123|20140321132233|1|0|0|....|20130211122143|... 12332312211|222321233|111|0|||||234432|20150222122354|1|0|0|....|20120112123133|... 

请将以下awk脚本保存为awk.src

 function date_str(val) { Y = substr(val,0,4); M = substr(val,5,2); D = substr(val,7,2); date = sprintf("%s-%s-%s",Y,M,D); return date; } function time_str(val) { h = substr(val,9,2); m = substr(val,11,2); s = substr(val,13,2); time = sprintf("%s:%s:%s",h,m,s); return time; } BEGIN { FS="|" } # ## MAIN Block # { for (i=1;i<=NF;i++) { if (i==10) { printf "%s %s", date_str($i), time_str($i); } else { printf $i; } if (i!=NF) { printf FS; } else { printf "\n"; } } } 

现在尝试一下,它应该打印:

 $ awk -f awk.src csv 19238328932|123233443|123|0

||123123|2014-03-21 13:22:33|1|0|0|….|20130211122143|… 12332312211|222321233|111|0

||234432|2015-02-22 12:23:54|1|0|0|….|20120112123133|…