이와 같은 데이터(거의 100000행)가 포함된 CSV 파일이 있습니다. 특정 날짜 범위 내에서 특정 날짜의 특정 단어가 파일에 나타나는 횟수를 계산해야 합니다. 예를 들어, 2020년 3월 15일부터 2020년 4월 16일까지 "Sinaloa"라는 단어의 발생 횟수를 계산해야 합니다. 이는 2020년 3월 15일, 2020년 3월 16일에 모든 "Sinaloa"를 계산한다는 의미입니다. 2020년 17월 3일, ... , 2020년 4월 16일
grep을 사용해 보았지만 첫 번째 날짜와 마지막 날짜만 계산됩니다.
편집: "멕시코시티"와 날짜를 2020년 4월 25일로 가정하겠습니다. 2020년 3월 15일부터 2020년 4월 25일까지 모든 "Ciudad de Mexico"의 수를 계산해야 합니다. 이 예에서 원하는 출력은 5입니다. 그런데 문제는 이 예의 최종 날짜가 사용자의 입력이므로 2020년 1월 5일로 변경하면 출력이 6이 되어야 한다는 것입니다.
"167386","Baja California","F",54,"01/04/2020","confirmado"
"0d01b5","Sinaloa","F",60,"13/04/2020","confirmado"
"1beec8","Ciudad de México","M",47,"16/04/2020","confirmado"
"15fcd7","Ciudad de México","M",46,"16/04/2020","confirmado"
"0a5675","Sinaloa","F",34,"19/05/2020","confirmado"
"0e9e95","Ciudad de México","F",31,"25/04/2020","confirmado"
"07fa63","Ciudad de México","M",37,"01/05/2020","confirmado"
"0693ef","Ciudad de México","F",48,"20/03/2020","confirmado"
"19afc8","Baja California","F",45,"06/04/2020","confirmado"
"093740","Baja California","M",81,"19/04/2020","confirmado"
"1b3c74","México","M",57,"16/04/2020","confirmado"
"025cb1","Baja California","M",51,"29/04/2020","confirmado"
"15764f","México","M",73,"05/05/2020","confirmado"
"07c084","Tabasco","F",52,"23/04/2020","confirmado"
"1b9e29","Ciudad de México","F",47,"11/04/2020","confirmado"
답변1
다음보다 좋은 특정 CSV 파서가 있습니다.앗실제 CSV를 구문 분석하고,csvkit
일치하는 항목이 0개 있습니다:
입력 파일
필수 헤더를 추가했습니다.
"c1", "c2", "c3","c4", "c5", "c6"
"167386","Baja California","F",54,"01/04/2020","confirmado"
"0d01b5","Sinaloa","F",60,"13/04/2020","confirmado"
"1beec8","Ciudad de México","M",47,"16/04/2020","confirmado"
"15fcd7","Ciudad de México","M",46,"16/04/2020","confirmado"
"0a5675","Sinaloa","F",34,"19/05/2020","confirmado"
"0e9e95","Ciudad de México","F",31,"25/04/2020","confirmado"
"07fa63","Ciudad de México","M",37,"01/05/2020","confirmado"
"0693ef","Ciudad de México","F",48,"20/03/2020","confirmado"
"19afc8","Baja California","F",45,"06/04/2020","confirmado"
"093740","Baja California","M",81,"19/04/2020","confirmado"
"1b3c74","México","M",57,"16/04/2020","confirmado"
"025cb1","Baja California","M",51,"29/04/2020","confirmado"
"15764f","México","M",73,"05/05/2020","confirmado"
"07c084","Tabasco","F",52,"23/04/2020","confirmado"
"1b9e29","Ciudad de México","F",47,"11/04/2020","confirmado"
주문하다:
$ csvgrep -c2 -r '^Sinaloa$' file | grep -c '1[567]/04/2020'
산출
0
답변2
날짜를 반복하고 패턴을 찾을 수 있습니다
d="2020-03-15"
until [[ "$d" == "2020-04-26" ]]; do
pattern=$(date -d "$d" +%d/%m/%Y)
d=$(date -I -d "$d + 1 day")
grep "Ciudad de México.*$pattern" file.csv
done
산출
"0693ef","Ciudad de México","F",48,"20/03/2020","confirmado"
"1b9e29","Ciudad de México","F",47,"11/04/2020","confirmado"
"1beec8","Ciudad de México","M",47,"16/04/2020","confirmado"
"15fcd7","Ciudad de México","M",46,"16/04/2020","confirmado"
"0e9e95","Ciudad de México","F",31,"25/04/2020","confirmado"
답변3
변수 로드awk
awk -F\" -v city="Ciudad de México" -v from="01/04/2020" -v to="16/04/2020" '
BEGIN{split(to,t,"/"); split(from,f,"/");
to=mktime(t[3]" "t[2]" "t[1]" 0 0 0"); from=mktime(f[3]" "f[2]" "f[1]" 0 0 0")}
$4~city{split($8,th,"/"); this=mktime(th[3]" "th[2]" "th[1]" 0 0 0");
c+=(this<=to&&this>=from)}END{print city, c}' file
Ciudad de México 3
송곳
분할 "
및 로드 조건
awk -F\" -v city="Ciudad de México" -v from="01/04/2020" -v to="16/04/2020" '
datespec 변수에서 날짜 요소 가져오기
BEGIN{split(to,t,"/"); split(from,f,"/");
타임스탬프로 변환
to=mktime(t[3]" "t[2]" "t[1]" 0 0 0"); from=mktime(f[3]" "f[2]" "f[1]" 0 0 0")}
city
메인 파일 체크인 을 반복 하고 일치하는 항목이 있으면 $4
타임스탬프를 가져옵니다.$8
$4~city{split($8,th,"/"); this=mktime(th[3]" "th[2]" "th[1]" 0 0 0");
c
타임스탬프가 범위 내에 있으면 카운터를 증가시킵니다.
c+=(this<=to&&this>=from)}
....
END{print city, c}' file