Bash는 awk 또는 기타 Linux 도구(csvcut)를 사용하여 csv 파일의 날짜를 변환합니다.

Bash는 awk 또는 기타 Linux 도구(csvcut)를 사용하여 csv 파일의 날짜를 변환합니다.
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()이 기능을 잘못된 방식으로 사용하고 있습니다. 또는 명령의 출력을 반환하지 않고 종료 상태(출력이 터미널로 전송됨)만 반환하므로 여기서는 이것이 사용되지 않습니다.

dateGNU를 가정하면 실행 날짜 형식을 다시 지정하는 스크립트 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

관련 정보