特定の値(>> 2など)でサブセットを指定し、列の最初の数字の合計数で割りたい列があります。どうすればいいですか?
サブセット>= 2の例:
入力:このような列
1
1
1
1
2
2
出力:
2/6=0.33333
私はawkを使ってこのようなことを試しました。
awk '($1 > 2) / $1' myfile
しかし、これはうまくいきません。
答え1
> 2
あなたの例には値がないので>= 2
。
awk '$1 >= 2 { t++ } END { print t/NR }' myfile
これは最初の列の各値を繰り返し、値が2以上の場合に変数を増やしますt
。最後に、t
レコードの総数(行数)で除算して結果を印刷します。
文字通り式を印刷するには、次のようにします。
awk '$1 >= 2 { t ++ } END { print t"/"NR"="t/NR }' myfile
答え2
このdc
ユーティリティを使用して計算を実行できます。
$ < myfile tr -s ' ' '\t' | cut -f1 |
dc -e "
[lM lN / p q]sq
[lM 1 + sM]sa
[? z0=q lN 1 + sN d2!>a c z0=?]s?
4k 0sN l?x
"
結果:
.3333
簡単な説明:
° Register `N` holds line count.
° Register `M` holds num of lines >= 2.
° Register `q` performs the division, printing it, and quitting. Kinda like the `END` clause of `awk`.
° Register `a` increments the current value stored in register `M`.
° Register `? ` reads the next line from stdin, checks whether it is empty. In case it us then it initiates the end procedure by invoking the q register. Otw, increments register N the one keeping the line count. Then compares the current line is greater than or equal to 2 . Increments reg M if it is. Then calls itself recursively to redo the same set of operations on the next line.
° 4k will set output accuracy to four digits and 0sN shall initialize the line counter, l?x will set the ball rolling recursively.