2

私がawkで知っているように、$1と$2はファイルの最初と2番目のフィールドを指します。ただし、$1と$2を使用して、変数の1番目と2番目のフィールドを参照できます。session=5の場合は変数に格納されます。次に、「セッション」を参照する$ 1と、「5」を参照する$2が必要です。ありがとうございました

入力ファイル

session=123
process=90
customer=145
session=123
customer=198
process=90

コード

 awk '$1 ~ /^Session|^CustomerId/' hi|xargs -L 1 -I name '{if (!($1 SUBSEP $2 in a)) {ids[$1]++; a[$1, $2]}} END {for (id in ids) {print "Count of unique", id, " " ids[id]}}'

詳細

最初に取得した出力を渡し、xargsを介してパイプし、xargsの "name"変数で行を読み取ります。これで、$ 1がxargsの最初のフィールドに対応するはずです。これが、私のクエリです。

出力

Count of unique sessions=2
Count of unique customer=2
4

6 に答える 6

1

探しているのがユニークな顧客とセッションの数である場合、これは次のことを行う可能性があります。

awk -F= '
  $1~/^(session|customer)$/ && !seen[$0] {
    seen[$0]=1;
    count[$1]++;
  }
  END {
    printf("Count of sessions: %d\n", count["session"]);
    printf("Count of customers: %d\n", count["customer"]);
  }' hi

カウントを維持することに加えて、これはカウントに貢献したラインの連想配列を維持し、2回目のラインのカウントを回避します-したがって、それを一意のカウントにします。

于 2012-06-22T00:03:40.600 に答える
1

FS="separator"BEGIN コード ブロック内で として、またはコマンド ライン オプションとして指定できるフィールド セパレータを使用しawkます-F "separator" 。最終的な出力には対応していません。

awk -F"=" '$1 == "session" || 
           $1 == "customer" { ids[$1]++ }  # do whatever you need with the counters.
           END { for (id in ids) {
                     print "Count, id "=" ids[id] }}' hi 
于 2012-06-21T23:33:03.727 に答える
1

スクリプトに「セッション」と「顧客」のみを含めるように制限したい場合は、正規表現をメイン スクリプトにセレクターとして追加するだけです。

awk -F= '$1 ~ /^(session|customer)$/ {if (!($1 SUBSEP $2 in a)) {ids[$1]++; a[$1, $2]}} END {for (id in ids) {print "Count of unique", id, " " ids[id]}}'
于 2012-06-22T01:40:34.557 に答える
0

削除した質問への回答は次のとおりです。

これは、以前の質問の 1 つに対する私の回答に基づいた自己完結型の AWK スクリプトです。

#!/usr/bin/awk -f
/^Customer=/ {
    mc[$0, prev]++
    if (!($0 in cseen)) {
        cust[++custc] = $0
        ids["Customer"]++
    }
    cseen[$0]
}

/^Merchant=/ {
    prev = $0
    if (!($0 in mseen)) {
        merch[++merchc] = $0
        ids["Merchant"]++
    }
    mseen[$0]++
}

END {
    for (id in ids) {
        print "Count of unique", id, ids[id]
    }
    for (i = 1; i <= merchc; i++) {
        merchant = merch[i]
        print "Customers under (" merchant ") is " mseen[merchant]
        for (j = 1; j <= custc; j++) {
            customer = cust[j]
            if (customer SUBSEP merchant in mc) {
                print "(" customer ") under (" merchant ") is " mc[customer, merchant]
            }
        }
    }
}

実行可能に設定して実行します。

$ chmod u+x customermerchant
$ ./customermerchant data.txt
于 2012-06-23T01:39:58.250 に答える
0

それでも代替案は

awk -F "=" '$1 ~ /customer|session/ {print $1}'|sort |uniq -c | awk '{print "Count of unique "$2"="$1}'
于 2012-06-22T13:16:18.020 に答える
0

awkすべてのソリューションを試してみませんか?それはもっと簡単です:

awk -F "=" '$1 ~ /customer|session/ { name[$1]++ } END { for (var in name) print "Count of unique", var"="name[var] }' hi

結果:

Count of unique customer=2
Count of unique session=2

にパイプする必要がある他の理由はありますxargsか?

HTH

于 2012-06-21T23:18:22.777 に答える