日付を00/00/0000形式に切り取るには?

日付を00/00/0000形式に切り取るには?

.csvファイルから抽出された日付を0/0/0000から00/00/0000まで埋め、変更したいです(例:1/9/2016 - > 01/09/2016)

このスクリプトがあります

sed 's/\/1\//\/01\//g; s/\/2\//\/02\//g; s/\/3\//\/03\//g; s/\/4\//\/04\//g; s/\/5\//\/05\//g; s/\/6\//\/06\//g; s/\/7\//\/07\//g; s/\/8\//\/08\//g; s/\/9\//\/09\//g' file_name.csv > file_name2.csv
sed 's/,1\//,01\//g; s/,2\//,02\//g; s/,3\//,03\//g; s/,4\//,04\//g; s/,5\//,05\//g; s/,6\//,06\//g; s/,7\//,07\//g; s/,8\//,08\//g; s/,9\//,09\//g' file_name2.csv > file_name3.csv 

答え1

0最初の2つの数字が1桁の数字の場合、このsedステートメントは最初の2つの数字にaを追加します。

sed -e 's!^[0-9]/!0&!' -e 's!/\([0-9]/\)!/0\1!'        

例えば

$ cat x
1/1/1970
10/1/2000
10/10/2100

$ sed -e 's!^[0-9]/!0&!' -e 's!/\([0-9]/\)!/0\1!' x
01/01/1970
10/01/2000
10/10/2100

答え2

実際、家庭をたくさんするだけでかなり簡単です。質問は例を提供していないので、次のような現実的な仮定がいくつかあります。

  • 日付フィールド間の区切り記号は次のとおりです。/
  • csvファイルに複数の列があります。
  • 日付は任意の列にあります。
  • 他の列には数字がある場合があります。

スティーブンの例は、最後の3つの質問を扱っていません。以下は、2つの改善点を示すスクリプトです。

#!/bin/sh
INPUT=foo.csv
echo GIVEN
cat $INPUT
echo BEFORE
sed -e 's!^[0-9]/!0&!' -e 's!/\([0-9]/\)!/0\1!' <$INPUT
echo IMPROVED
sed     \
        -e 's,^\([0-9][/]\),0\1,' \
        -e 's,\([,/]\)\([0-9]\),\10000\2,g' \
        -e 's,^0*\([0-9]\{2\}[/]\),\1,' \
        -e 's,\([,/]\)0*\([0-9]\{2\}\),\1\2,g' \
        <$INPUT
echo BETTER
sed     \
        -e 's,^\([0-9][/]\),0\1,' \
        -e 's,\([,/]\)\([0-9]\),\10000\2,g' \
        -e 's,^0*\([0-9]\{2\}[/]\),\1,' \
        -e 's!0*\([0-9]\{2\}\)\([,/]\)0*\([0-9]\{2\}\)\([/]\)0*\([0-9]\{4,\}\)!\1\2\3\4\5!g' \
        <$INPUT

そして、スクリプトの実行結果は次のとおりです。

GIVEN
1/1/1970
10/1/2000
10/10/2100
first,1/1/1970
second,10/1/2000
third,10/10/2100
9term,1/1/1
BEFORE
01/01/1970
10/01/2000
10/10/2100
first,1/01/1970
second,10/01/2000
third,10/10/2100
9term,1/01/1
IMPROVED
01/01/1970
10/01/2000
10/10/2100
first,01/01/1970
second,10/01/2000
third,10/10/2100
9term,01/01/01
BETTER
01/01/1970
10/01/2000
10/10/2100
first,01/01/1970
second,10/01/2000
third,10/10/2100
9term,01/01/0001

完全な解決策は境界(割引かどうかなど1/1/1text)と引用符(csvファイルは列のカンマを解決するために二重引用符を使用)をよりよく説明します。

関連情報