2015-06-22 51 views
2

我有一個非常大的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

回答

4

請保存以下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