.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ファイルは列のカンマを解決するために二重引用符を使用)をよりよく説明します。