Bash를 사용하여 특정 범위의 특정 단어에 대한 텍스트 줄 수 계산

Bash를 사용하여 특정 범위의 특정 단어에 대한 텍스트 줄 수 계산

이와 같은 데이터(거의 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

관련 정보