awk -F"," '{OFS=","; $1=system("date -d "$1" +%d-%m-%Y") ; print $0}' data.csv | head
csv 파일의 첫 번째 열을 가져오고 날짜 형식을 %dd-%mm-%yyyy로 정규화하려고 합니다.
위의 코드를 시도하면 날짜: 쓰기 오류: 깨진 파이프가 표시됩니다.
하지만 아래 코드를 시도해 보면 다음과 같습니다.
dd=$(csvcut -c 1 -e ISO-8859-1 -d "," data.csv | head -2 | sed -n 2p)
echo $dd
echo $(date -d $dd "+%d-%m-%Y")
나는 출력을 얻습니다 :
2017-02-03
2017년 3월 2일
내가 뭘 잘못했나요? 어떤 팁이 있나요? 감사해요.
내 시스템: Ubuntu 16.04.1 LTS
편집 2: 다음은 샘플 파일입니다.http://grn.dk/sites/default/files/attachments/data.csv
편집하다:
CSV 데이터 파일 결정(입력): data.csv(여러 행)
Bogført,Tekst,Beløb,Saldo
2017-02-03, random text,-425,-611524.54
산출:
Bogført,Tekst,Beløb,Saldo
03-02-2017, random text,-425,-611524.54
그러나 날짜 형식은 다른 형식일 수 있습니다. 저는 현재 csv 가져오기 작업의 날짜를 표준화하는 중입니다. 감사해요.
답변1
system()
이 기능을 잘못된 방식으로 사용하고 있습니다. 또는 명령의 출력을 반환하지 않고 종료 상태(출력이 터미널로 전송됨)만 반환하므로 여기서는 이것이 사용되지 않습니다.
date
GNU를 가정하면 실행 날짜 형식을 다시 지정하는 스크립트 date
는 다음과 같습니다 .awk
BEGIN { OFS = FS = "," }
$1 {
cmd = sprintf("date -d '%s' '+%%d-%%m-%%Y' 2>/dev/null", $1);
cmd | getline $1;
print;
close(cmd);
}
실행하세요:
$ awk -f script.awk data.csv
Bogført,Tekst,Beløb,Saldo
03-02-2017, random text,-425,-611524.54
스크립트는 빈 입력 줄을 삭제합니다. cmd
실제 날짜 변환을 수행하기 위해 GNU를 사용하는 명령 문자열을 생성합니다 date
. 오류는 date
삭제되며 $1
변경되지 않습니다.
이를 수행하려면 cvssql
(에서 csvkit
):
$ sed '1,2d' data.csv | csvsql -H --query 'SELECT strftime("%d-%m-%Y", a), b, c, d FROM stdin' | sed '1d' >new_data.csv
데이터에는 new_data.csv
머리글 행이 없습니다. 다시 추가하려면:
$ cat <( head -n 1 data.csv ) new_data.csv >even_newer_data.csv
답변2
Ubuntu를 사용하고 있으므로 awk
유용한 시간 및 날짜 기능을 제공하는 GNU가 있을 것입니다.
echo "2017-03-02" | \
awk '{ gsub(/-/, " ", $1); t = mktime($1 " 0 0 0"); print strftime("%d-%m-%Y", t);}'
답변3
bash-4.1$ cat a.txt
2017-02-03, random text,-425,-611524.54
2017-02-08, random text,-425,-611524.54
2017-02-07, random text,-425,-611524.54
bash-4.1$ awk -F, '{a="date -d "$1" +%Y%m%d"; while (a |getline line){$1=line;}print $0}' OFS=, a.txt
20170203, random text,-425,-611524.54
20170208, random text,-425,-611524.54
20170207, random text,-425,-611524.54
bash-4.1$ awk -F, '{a="date -d "$1" +%Y%m"; while (a |getline line){$1=line;}print $0}' OFS=, a.txt
201702, random text,-425,-611524.54
201702, random text,-425,-611524.54
201702, random text,-425,-611524.54
awk -F, 'NR==1{print;next}{a="date -d "$1" +%Y%m"; while (a |getline line){$1=line;}print $0}' OFS=, a.txt