Bash修改CSV以更改字段

问题描述:

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

我看到了一些使用awk的例子,但用于数学修改。我可以使用类似这样的方法来完成上述更改吗?

FILE.CSV例如:

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

是你使用GNU awk? –

+0

我正在使用GNU Awk 3.1.5 – 123onetwothree

+0

是的,这有可能是 – 123

请保存以下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|... 
+0

是的这适用于条目10 :) – 123onetwothree

+0

在'如果'测试中包含其他列并完成工作:) –

+0

你救了我的命。非常感谢你的回答!非常感谢谢谢 – 123onetwothree