grepはすべての行を保存しません

grepはすべての行を保存しません

こんにちは、コミュニティの誰かがこのコードを書いています。問題は、grepの出力をファイルに保存しようとすると、Positivos.txtすべてのループではなく最後の日だけが保存されることです。試してみましたがgrep -r -o成功しませんでした。

d1="2020-03-15"
until [[ "$d1" ==  $ano-$mes-$dia ]]
do
rep=$( date -d "$d1" +%d/%m/%Y )
d1=$( date -I -d "$d1 + 1 day" )
grep -o "$estado.*$rep" /home/efc20/Proyecto/CasosPositivos.csv > Positivos.txt
done

ベストアンサー1

grep何度も呼び出されます。各後続の呼び出しは前の呼び出しの出力を上書きします。

  1. 代わりに、以下を追加できます。

    d1="2020-03-15"
    until [[ "$d1" ==  $ano-$mes-$dia   ]]
    do
    rep=$( date -d "$d1" +%d/%m/%Y )
    d1=$( date -I -d "$d1 + 1 day" )
    grep   -o "$estado.*$rep" /home/efc20/Proyecto/CasosPositivos.csv >> Positivos.txt
    done
    
  2. ループ全体の出力を収集してファイルに書き込むことができるので、書き込みは一度だけ実行されます(つまり、ファイルを開くたびに1回)。ループの他の部分から生成された出力(コード変更後)が誤って同じファイルに書き込まれる危険性があります。

    d1="2020-03-15"
    until [[ "$d1" ==  $ano-$mes-$dia   ]]
    do
    rep=$( date -d "$d1" +%d/%m/%Y )
    d1=$( date -I -d "$d1 + 1 day" )
    grep   -o "$estado.*$rep" /home/efc20/Proyecto/CasosPositivos.csv
    done > Positivos.txt
    
  3. 最もエレガントな解決策(この場合は実質的な違いはありません)は、新しいファイル記述子を開くことです。

    exec 3>Positivos.txt
    d1="2020-03-15"
    until [[ "$d1" ==  $ano-$mes-$dia   ]]
    do
    rep=$( date -d "$d1" +%d/%m/%Y )
    d1=$( date -I -d "$d1 + 1 day" )
    grep   -o "$estado.*$rep" /home/efc20/Proyecto/CasosPositivos.csv >&3
    done
    

おすすめ記事