내 질문의 짧은 버전은 다음과 같습니다. 쉼표로 구분된 날짜 목록을 한 형식에서 다른 형식으로 변환하는 방법은 무엇입니까? 더 구체적으로 말하면 다음 형식의 문자열을 변환하는 한 줄 명령이 필요합니다.
YYYY/MM/DD,YYYY/MM/DD
다음 형식의 문자열입니다.
DD/MM/YYYY,DD/MM/YYYY
이제 내 문제의 배경을 설명하겠습니다.
행에 다음 형식의 인접한 날짜 쌍이 포함된 CSV 파일이 있습니다.
YYYY/MM/DD
grep
이 날짜 쌍을 추출하려면 다음 명령을 실행합니다 .
grep -Po '[1-2][0-1][0-9][0-9]/[0-1][0-9]/[0-1][0-9]','[1-2][0-1][0-9][0-9]/[0-1][0-9]/[0-1][0-9]' file.csv`
예를 들어, 다음 문자열이 생성됩니다.
2016/05/16,2017/06/15
date
다음을 사용하여 단일 날짜 문자열을 변환 할 수 있습니다 .
date -d '2016/05/16' '+%d/%m/%Y'
그러면 원하는 결과가 생성됩니다.
16/05/2016
이 명령을 다음과 같은 여러 입력 문자열에 적용해 보았습니다.
date -d"2016/05/16","2017/06/15" "+%d-%m-%Y"
그러나 그것은 작동하지 않았습니다. 다음과 같은 오류 메시지가 나타납니다.
Error :- Invalid date - 2016/05/16,2017/06/15'
내가 원하는 2016/05/16,2017/06/15
것은 16/05/2016,15/06/2017
.
답변1
sed를 사용하세요...
echo "2016/05/16,2017/06/15" | sed 's/\([0-9]\{4\}\)\/\([0-9]\{2\}\)\/\([0-9]\{2\}\),\([0-9]\{4\}\)\/\([0-9]\{2\}\)\/\([0-9]\{2\}\)/\3\/\2\/\1,\6\/\5\/\4/g'
16/05/2016,15/06/2017
답변2
date -d
다음은 이 명령의 사용을 확장하는 솔루션 입니다 . 쉘 스크립트와 표준 GNU 명령줄 tr
도구 만 사용합니다 paste
.
tr ',' '\n' \
| while read line; do date -d "${line}" "+%d/%m/%Y"; done \
| paste -d, -s -
tr
한 줄의 입력을 두 줄로 나누기 위해 쉼표를 개행 문자로 변환하는 데 사용합니다 . 그런 다음 두 줄을 while
루프로 연결하고 각 줄에 서식 지정 명령을 적용합니다 date
. 마지막으로 변환된 날짜 문자열을 파이프하여 paste
쉼표로 구분된 단일 목록으로 재조립합니다.
샘플 입력은 다음과 같습니다.
echo 2016/05/16,2017/06/15 \
| tr ',' '\n' \
| while read line; do date -d "${line}" "+%d/%m/%Y"; done \
| paste -d, -s -
이것이 생성하는 출력은 다음과 같습니다.
16/05/2016,15/06/2017
이것을 grep
게시물의 명령과 결합하면 다음과 같은 결과를 얻을 수 있습니다.
grep -Po '[1-2][0-9][0-9][0-9]/[0-1][0-9]/[0-1][0-9]','[1-2][0-9][0-9][0-9]/[0-1][0-9]/[0-1][0-9]' file.csv \
| tr ',' '\n' \
| while read line; do date -d "${line}" "+%d/%m/%Y"; done \
| paste -d, -s -
와 함께 사용되는 정규식을 단축할 수도 있습니다 grep
. 아마도 이와 같은 것도 작동할 것입니다(후행 쉼표와 일치합니다).
grep -Po '([12][0-9]{3}(/[01][0-9]){2},?){2}' file.csv
마지막으로 출력 리디렉션을 사용하여 결과를 파일에 쓸 수 있습니다.
grep -Po '[1-2][0-9][0-9][0-9]/[0-1][0-9]/[0-1][0-9]','[1-2][0-9][0-9][0-9]/[0-1][0-9]/[0-1][0-9]' file.csv \
| tr ',' '\n' \
| while read line; do date -d "${line}" "+%d/%m/%Y"; done \
| paste -d, -s - \
> new_file.csv