現在作業中のスクリプトに表示される行数を表示するのに問題があり、Puttyを使用しています。スクリプトは、次のようなテキストファイルを読み込みます。
user1|login|1
user2|login|1
user1|testing tests|10
user1|voiding tests|10
user2|logout|1
user1|logout|1
現在私のawkは次のようになります
awk -F '|' '$1 == "user1" {sum += $3} END {print "user has run " NF "
processes for a total of " sum " minutes" }' textfile
現在、これは「user1が合計22分間に3つのプロセスを実行しました」というメッセージを提供しています。
私の計算が正しい場合は、行数(4つ)を正確に計算するために必要です。
答え1
NF は「フィールド数」、つまり列数です。この例では、各行には3つの列があるため、一致数に関係なく、出力は常に3です。proc
以下に示すように、各一致に対して追加数を計算する必要があります。
$ awk -F '|' '$1 == "user1" {proc += 1; sum += $3} END {print "user has run " proc " processes for a total of " sum " minutes" }' textfile
user has run 4 processes for a total of 22 minutes
答え2
与えられた例では、以下を試してみてください。
1人のユーザーのみ:
awk -F'|' '$1=="user1"{i=$1;u[$1]++;m[$1]+=$3};END{print i,"processes:",u[i],"minutes:",m[i]}' file1
user1 processes: 4 minutes: 22
すべてのユーザーの場合:
awk -F'|' '++u[$1]{m[$1]+=$3};END{for (i in u) print i,"processes:",u[i],"minutes:",m[i]}' file1
user1 processes: 4 minutes: 22
user2 processes: 2 minutes: 2
答え3
問題は、NFが一致する行の数ではなく、フィールド(列)の数であることです。たとえば、「sum」に似た他の変数を定義し、それを使用して計算できます。