2017-06-07 24 views
1

我有一個問題,運行此代碼時:使用gawk格式化日期字符串?

gawk 'BEGIN{FS=";";RS="\r\n"} 
     { 
      for (i = 1; i <= NF; i++) { 
       if(match($i, /([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{6})/, m)){ 
        $i = m[1]"-"m[2]"-"m[3]" " m[4]":"m[5]":"m[6] 
        printf $0 "\n" 
       } 

      } 
     }' contact20.txt > cleaned.txt 

與輸入:

3;0952;2001-03-22-11.56.13.514119;2;2014-09-21-10.25.58.918626;J;2015-12-27-14.17.45.593190;N;0;0001-01-01-00.00.00.000000;N;2014-09-21-10.25.58.918626;2012-11-03-21.52.55.270989;N;0001-01-01-00.00.00.000000 

我得到:

3 0952 2001-03-22 11:56:13 2 2014-09-21-10.25.58.918626 J 2015-12-27-14.17.45.593190 N 0 0001-01-01-00.00.00.000000 N 2014-09-21-10.25.58.918626 2012-11-03-21.52.55.270989 N 0001-01-01-00.00.00.000000 

但結果應該是這樣的:

3;0952;2001-03-22 11:56:13;2;2014-09-21 10:25:58;J;2015-12-27 14:17:45;N;0;0001-01-01 00:00:00;N;2014-09-21 10:25:58;2012-11-03 21:52:55;N;0001-01-01 00:00:00 

我想不通爲什麼要從字符串中刪除;,並且還忽略瞭如0001-01-01-00.00.00.000000這樣的日期字符串,並且匹配只匹配第一個字符?

我需要更改哪些工作屬性?

+0

發佈預期結果 – RomanPerekhrest

+0

@RomanPerekhrest更新了它。完全忘了結果......謝謝:) – jycr753

+0

把'OFS'改成''''。 \ – 123

回答

1

您目前的做法會爲循環中的每個字段輸出/重複相同的行。
爲了得到期望的結果與轉化一條線「日期」值使用以下命令:

awk 'BEGIN{ FS=OFS=";" } 
    { for (i = 1; i <= NF; i++) { 
      if(match($i, /([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{6})/, m)){ 
       $i = m[1]"-"m[2]"-"m[3]" " m[4]":"m[5]":"m[6]          
      } 
     } 
    }1' contact20.txt > cleaned.txt 

cat cleaned.txt 
3;0952;2001-03-22 11:56:13;2;2014-09-21 10:25:58;J;2015-12-27 14:17:45;N;0;0001-01-01 00:00:00;N;2014-09-21 10:25:58;2012-11-03 21:52:55;N;0001-01-01 00:00:00 
1

你並不需要一個循環,你需要的是:

$ gawk '{print gensub(/([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{6})/,"\\1-\\2-\\3 \\4:\\5:\\6","g")}' file 
3;0952;2001-03-22 11:56:13;2;2014-09-21 10:25:58;J;2015-12-27 14:17:45;N;0;0001-01-01 00:00:00;N;2014-09-21 10:25:58;2012-11-03 21:52:55;N;0001-01-01 00:00:00 

這當然可以很容易地與完成的sed:

$ sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})\.([0-9]{6})/\1-\2-\3 \4:\5:\6/g' file 
3;0952;2001-03-22 11:56:13;2;2014-09-21 10:25:58;J;2015-12-27 14:17:45;N;0;0001-01-01 00:00:00;N;2014-09-21 10:25:58;2012-11-03 21:52:55;N;0001-01-01 00:00:00 

上面使用GNU awk for gensub()和GNU或OSX sed for -E。