科学的表記法を使用して、テキストファイル内の特定の数の頻度を計算します。

科学的表記法を使用して、テキストファイル内の特定の数の頻度を計算します。

背景

次の名前のテキストファイルがありますblood_conc.txt

  0, 0, 0, 0, 0, 0, 0, 1.32006590271e-05, 1.990014992001e-05, 1.504668143682e-05, 2.176900659261e-06,
    7.673488970859e-06, 2.169217049562e-05, 4.343183585883e-05, 0, 0, 0, 0, 0, 0, 0,
    2.143804950099e-05, 0, 0, 1.849919603625e-06, 0, 0, 0, 0, 0, 0, 0, 4.123812986073e-07, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0.0001365177, 7.81009e-06, 2.695291e-07, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0,
  0, 0, 0, 0, 0, 0, 0, 2.1799e-05, 1.82574e-05, 1.68109e-05, 2.722782e-05,
    5.355517e-05, 8.196468e-05, 7.177729e-05, 7.863765e-05, 5.774439e-05,
    1.329413e-08, 0, 0, 0, 4.320018e-06, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0.0003335425, 0, 0, 0, 0, 0, 0, 0, 0, 6.061237e-05, 6.36887e-05,
    2.250928e-05, 0, 0, 7.327124e-07, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

何個あったか数えてみたい03~8行の間(含む)です。つまり

2.143804950099e-05, 0, 0, 1.849919603625e-06, 0, 0, 0, 0, 0, 0, 0, 4.123812986073e-07, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0.0001365177, 7.81009e-06, 2.695291e-07, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0,
  0, 0, 0, 0, 0, 0, 0, 2.1799e-05, 1.82574e-05, 1.68109e-05, 2.722782e-05,
    5.355517e-05, 8.196468e-05, 7.177729e-05, 7.863765e-05, 5.774439e-05,

と頻度054でなければなりません。

私は2つのことをするために簡単なコマンドラインが欲しいです。

タスク1:総数03~8行のテキストです。

タスク2:(2.452555e-05、0.0032784)のように、間隔の間の値の数を計算します。


私の考え

ウェブサーフィンと投稿検索を少し試しました。私はこれを見つけて役に立つawkかもgrep -cしれません。

ライン範囲に集中するにはawk 'NR==3, NR==8' blood_conc.txt

grepしかし、orを使って進む方法がわかりませんperl。周波数だけを返す単純なコマンドラインが必要です。

答え1

次のことを試すことができますawk

awk -F"," 'NR == 3, NR == 8 { for (i = 1; i <= NF; i++) { if ($i == 0) { cnt++; } if ($i >= 2.452555e-05 && $i <= 0.0032784) { cnt1++; } } } END { print cnt, cnt1; }' file

答え2

始点は良いです。これで、適切なフィールド区切り文字を定義することが前提条件であるフィールドを繰り返す必要があります。ゼロの数を数えてください。

awk '
  BEGIN { FS="[, ]+" }
  NR==3, NR==8 { for (i=1; i<=NF; i++) if ($i==0) c++ }
  END { print c }
'

範囲を確認するには、ifそれに応じて条件を変更します(例:)if ($i >= ... && $i <= ...)

関連情報