複数のファイルで1行の発生回数を計算します。

複数のファイルで1行の発生回数を計算します。

いくつかのログファイルがあり、それを収集して特定の行の発生回数を計算する必要があります。

問題は、最初のファイルの特定の行から始まり、その行以降の項目のみを計算する必要があることです。他のすべてのファイルは徹底的に検索する必要があります。最初のファイルだけを最後のx行に制限するだけです。

その後、結果に200を掛ける必要があります。 1つのコマンドでこれを実行したいと思います。

これは2つのログファイルを使用する実際の例ですが、すぐにそれを3つのファイルに拡張する必要があり、誰かがこれを行うより良い方法を見つけることができることを願っています。

expr `tail -n 5147 Log1.log.2013-11-18 | grep "The line I need to count" | wc -l` + `cat Log2.log | grep "The line I need to count" | wc -l` | awk '{print $1"*200"}' | bc

答え1

2番目の猫の後に3番目のファイルを追加できるはずです。

expr `tail -n 5147 Log1.log.2013-11-18 | grep "The line I need to count" | wc -l` + `cat Log2.log Log3.log | grep "The line I need to count" | wc -l` | awk '{print $1"*200"}' | bc

例:

$ echo abc > 1.txt 
$ echo cde > 2.txt 
$ echo def > 3.txt 
$ cat 1.txt 2.txt 3.txt | grep d 
cde 
def

答え2

ファイル数に関係なく、一般的な解決策:

 for file1 in log1.txt log2.txt logN.txt; do
   for file2 in logA.txt logB.txt logC.txt; do
     for file3 in logD.txt logE.txt logF.txt; do
     match1=$(tail -n 5147 $file1 | grep -c 'The line');
     match2=$(grep -c "the line" $file2);
     match3=$(grep -c "the line" $file3);
     echo "($match1 + $match2 + $match3) * 200" | bc;
   done;
 done;
done

the lineこれにより、各sの最後の5147行で発生回数が計算され、として保存され$file1ます$match1。次に、各sで発生回数を計算して保存します。次に計算します。the line$file2match2file3$match3($match1 + $match2 + $match3) * 200

実行中の操作にファイルを追加して構文を変更するだけです。

echo "$(tail -n 5147 Log1.log.2013-11-18 | grep -c 'The line') \ 
      $(grep -c 'The line' Log2.log) $(grep -c 'The line' Log3.log)" | 
        awk '{print ($1+$2+$3)*200}' 

以下はいくつかのヒントです。grep -c一致を印刷する代わりに計算するので、必要ありませんwcawk数学を実行できるため、必要ありませんbc。私はもはやシェルで算術演算を実行しないので、echo代わりに使用しますexpr。 3つの検索結果をエコーし​​てに渡すと、次awkのような結果が出ます。

echo "10 4 12" | awk '{print ($1+$2+$3)*200}' 

より簡潔なバージョン:

echo $((($(tail -n 5147 Log1.log.2013-11-18 | grep -c "The line) + \ 
         $(grep -c "The line" Log2.log) + $(grep -c "The lne" Log3.log)) * 200))

これはシンボルを使用してシェルですべての数学演算を実行します$(( ))。試してみてくださいecho $((2*4))。読みやすくはありませんが、次のように拡張されます。

echo "$(( ($file1_matches + $file2_matches + $file3_matches) * 200 ))"

答え3

複数のCSVファイルから行を計算する同様の問題を解決しました。

スクリプトの出力であるCSVファイルの大きなリストがあるため、同じフィールドがあります。有効な値を持つ行数に興味があります。

このトリックを実行するコマンドは次のとおりです。

awk -F, '{if ($5>0.0) print $5}' va.2021-04-11.153123.csv va.2021-04-11.111709.csv | wc -l
  • -F,区切り記号の設定,(私のCSVファイルは,区切られています)
  • '{if ($5>0.0) print $5}'awk何をすべきかを知らせる「スクリプト」です。
    • 5番目のフィールドが0.05番目のフィールドより大きい場合
    • wc次に、フラグと一緒にパイプして-l出力の行数を計算します。
  • va.2021-04-11.153123.csv va.2021-04-11.111709.csv2つのCSVファイルがスペースで区切られたリスト。

関連情報