2017-10-31 8 views
0

ソースファイルに18列の列10,11,15がdd/mm/yyyyの形式であり、これらすべてをyyyy-mm-ddに変換し、他の列とともにターゲットファイルに書き込む必要があります。 私は変数で日付の書式設定機能を認識していますが、ファイルのいくつかの列に同じものを適用する方法はわかりません。シェルスクリプトを使用してファイル内の日付形式をdd/mm/yyyyからyyyy-mm-ddに変更します。

答えて

0

おそらくコマンドawkを使用して解決することができます。

あなたは3つのCOLSは、日付(COL 10、11、15)を含有してきたように、ここで私は、フィールド区切り文字は|あるサンプル文字列を想定して、列は日付が含まれている第四COL

aa|bb|cc|29/09/2017|dd|ee|ff 

は、抽出するためにString-Manipulation Functionsを使用しています日付を入力し、getlineでフォーマットして、期待される構文にフォーマットします。

コマンドは

echo 'aa|bb|cc|2017-09-29|dd|ee|ff' | awk -F\| 'BEGIN{OFS="|"}{$4=gensub(/([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4})/,"\\3\\2\\1","g",$4); "date --date=\""$4"\" +\"%F\"" | getline a; $4=a; print $0}' 

出力はあなたを助けるために

aa|bb|cc|2017-09-29|dd|ee|ff 

希望です。あなたがdateutilsパッケージがインストールされている場合

0

、あなたはdateutils.dconv

cat file | dateutils.dconv -S -i "%d/%m/%Y" 
  • -iは、入力日付形式に
  • -S SEDモード、プロセスだけでマッチした文字列を指定して使用してコピーすることができ、残り

入力ファイル

aa|bb|cc|29/09/2017|dd|ee|ff|02/10/2017|gg 

出力

aa|bb|cc|2017-09-29|dd|ee|ff|2017-10-02|gg 
1

私はテストで使用可能なマシンを持っていますが、あなたが同じことを3回行っているので、少しの機能をawkの使用を検討していません。 AWK functions、およびsplitため

awk ‘ 
    function dodate(in){ 
     split(in,/\//,a) # split existing date into elements of array “a” 
     return a[3] “-“ a[2] “-“ a[1] 
    } 

    { $10=dodate($10); $11=dodate($11); $15=dodate($15); print }’ yourFile 

参考:それはこのようになります。

各行のフィールドはカンマで区切られている場合は、とのことawkを言う:私はdateコマンドを使用すると思い

awk -F, ... 
0

while read fmtDate 
     do 
     date -d ${fmtDate} "+%Y-%m-%d" 
    done 
+0

OPは、各ライン上に3つの日付を持っていますファイル。行のフィールドはおそらくカンマで区切られており、日付はフィールド10,11,15にあります。あなたのコードはそれに対処していません。 –

関連する問題