.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
처음 두 숫자가 한 자리 숫자인 경우 이 sed 문은 처음 두 숫자에 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 파일에 열이 두 개 이상 있습니다.
- 날짜는 모든 열에 있을 수 있습니다.
- 다른 열에는 숫자가 있을 수 있습니다.
스티븐의 예는 마지막 세 가지 질문을 다루지 않습니다. 다음은 두 가지 개선 사항을 보여주는 스크립트입니다.
#!/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 파일은 열의 쉼표를 해결하기 위해 큰따옴표를 사용함)를 더 잘 설명합니다.