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

関連情報