2016-07-19 2 views
1

は、次のように私は、3つの列を持つファイルがあるとしましょう:awkを使用して1つの列の内容を他の2つの列で数える方法は?

00:00:01 Login  Steve 
00:00:01 Install Sarah 
00:00:01 Install Sarah 
00:00:02 Explorer Sarah 
00:00:02 Explorer Sarah 
00:00:02 Install Steve 
00:00:02 Firewall Sarah 
00:00:02 Logout Steve 
00:00:04 Logout Sarah 

は、各ユーザが各タイムスタンプに行っユニークなアクションをカウントアップするためのawkを使用することが可能ですので、出力は次のようなものです:

私は、この結果を与える

awk '{count[$1,$3,$2]++}END{for (i in count){split(i,a,SUBSEP); print a[1],a[2],count[i]}}' awktest.txt 

を::

00:00:01 Steve Login 1 
00:00:01 Sarah Install 2 
00:00:02 Sarah Explorer 2 
00:00:02 Steve Install 1 
00:00:02 Sarah Firewall 1 
00:00:02 Steve Logout 
00:00:04 Sarah Logout 

これは、私が来ている最も近い

00:00:02 Sarah 1 
00:00:02 Steve 1 
00:00:02 Steve 1 
00:00:01 Steve 1 
00:00:04 Sarah 1 
00:00:02 Sarah 2 
00:00:01 Sarah 1 
00:00:01 Sarah 1 

私はCygwinでこれをやっています。

+1

なぜ出力の最後の2行にカウントがないのですか? – jas

+1

あなたの実際の質問は何ですか?あなたは問題を述べ、それを解決するために何をしましたか。 –

+1

したがって、配列の3つのインデックスのうちの2つを出力し、3つのインデックスのうちの1つが出力から欠落しているコードを書きました。何が問題になるのでしょうか.... –

答えて

0
$ awk -F"\t" -v OFS="\t" '{arr[$0]+=1} END {for(i in arr) print i,arr[i]}' test.in 
00:00:01  Install Sarah 2 
00:00:04  Logout Sarah 1 
00:00:02  Firewall  Sarah 1 
00:00:01  Login Steve 1 
00:00:02  Logout Steve 1 
00:00:02  Install Steve 1 
00:00:02  Explorer  Sarah 2 
+0

これは完璧に働いた、ありがとう! 私はかなり新しい**から** – SVill

+0

これは完璧に、ありがとう! 私はawkをかなり新しくしているので、私はあなたの声明を見て、各部の仕組みを理解できるかどうかを見ました。これは正確な評価ですか? '-F" \ t "':フィールドセパレータをタブとして設定します。 '-v':スクリプトに変数を渡します。 'OFS =" \ t "':出力セパレータフィールドをタブに設定します。 '{arr [$ 0] + = 1}':現在の行を見て、その行に値1を加えます。 'END':スクリプトの最終アクションを実行します。 '{for i in arr} print i、arr [1]}':配列の変数iに対して、arrがiの関数であるiの値を出力します。 – SVill

+0

'arr [$ 0] + = 1':現在のレコード' $ 0'をキーとして 'arr'を配列し、その配列要素の値を1つ累積します。 'for(i in arr)print i、arr [1]}':各配列 'arr'要素はそのキーと値を出力します。 –

関連する問題