CSV의 날짜 변환에 도움이 필요합니다. 기본적으로 컬럼을 변환해서 새 파일로 저장할 수는 있지만 원본 CSV로는 저장할 수 없습니다.
내 CSV의 첫 번째 열인 DD/MM/YYYY HH:MM
로 변환하려는 날짜 형식의 CSV가 있습니다 .YYYY-MM-DD HH:MM
내 CSV 파일에는 다음과 같은 내용이 있습니다.
29/01/2018 14:07,payable,37159871,,30521316
29/01/2018 14:07,payable,37159872,,30521316
29/01/2018 14:07,payable,37159870,,30521316
29/01/2018 14:07,payable,37159869,,30521316
29/01/2018 14:07,payable,37159868,,30521316
나는 다음과 같은 것을 원합니다 :
2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316
내가 할 수있는 것:
gawk -F, '{split($1, a, "/| "); print a[3]"-"a[2]"-"a[1]" "a[4]}' /path/to/file.csv > test_file
이제 CSV 파일에 다시 저장하는 방법을 알고 싶습니다.
답변1
이 예제의 편집은 매우 간단하므로 Awk를 사용할 필요가 없습니다.
GNU Sed를 사용하는 것은 다음과 같이 간단합니다:
sed -rie 's_^(..)/(..)/(....)_\3-\2-\1_' file.csv
BSD Sed의 경우 다음을 사용하십시오.
sed -Ei '' -e 's_^(..)/(..)/(....)_\3-\2-\1_' file.csv
POSIX 도구만 사용하면 약간 보기 흉하지만 나쁘지는 않습니다.
printf '%s\n' '%s/^\(..\)\/\(..\)\/\(....\)/\3-\2-\1/' x | ex file.csv
편집: 실제로 자세히 살펴보세요POSIX 사양ex
Sed와 마찬가지로 (거의) 모든 구분 기호를 사용할 수 있음을 나타냅니다. 그래서:
printf '%s\n' '%s_^\(..\)/\(..\)/\(....\)_\3-\2-\1_' x | ex file.csv
약간더 나은 것.
답변2
awk에는 "제자리에서 편집" 옵션이 내장되어 있지 않으며(보통 뒤에서 복사본으로 구현됨) 읽기 이후이 답변, 이 경우 내가 선호하는 솔루션은 다음과 같습니다.
cp 입력 파일 임시 파일&& 명령... 임시 파일> 입력 파일&& rm 임시 파일
귀하의 상황에 맞게:
cp /path/to/file.csv temp_file &&
gawk -F, '{split($1, a, "/| "); print a[3]"-"a[2]"-"a[1]" "a[4]}' < temp_file > /path/to/file.csv &&
rm temp_file
&&
명령을 함께 바인딩하고 이전 명령이 성공한 경우에만 후속 명령을 실행하는 구문을 참고하세요 .
답변3
GNU awk를 사용하고 있으므로:
gawk -i inplace -F, ...
원본 파일을 백업하고 싶다면
gawk -i inplace -v INPLACE_SUFFIX=".bak" -F, ...
답변4
다음 awk 명령을 사용하여 동일한 효과를 얻었습니다.
입력.csv
2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316
주문하다
awk '{gsub("/","-",$0);print $0}' input.csv| awk -F "-" '{print $3,$2,$1}' | awk -F " " '{print $1"-"$(NF -1)"-"$NF,$2}'
산출
2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316