2

正如我在 awk 中所知道的,$1 和 $2 指的是文件的第一个和第二个字段。但是可以使用 $1 和 $2 来引用变量的第一个和第二个字段.. 这样如果 session=5 存储在一个变量中。然后我想让 $1 指代 'session' 和 $2 指 '5' 。谢谢

输入文件

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

使用字段分隔符,它可以在 BEGIN 代码块内指定为FS="separator",或作为命令行选项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)$/ && !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

除了保持计数之外,这还保留了贡献计数的行的关联数组,以避免第二次计数行 - 从而使其成为唯一计数。

于 2012-06-22T00:03:40.600 回答
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

您为什么不尝试所有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吗?

高温高压

于 2012-06-21T23:18:22.777 回答
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 脚本:

#!/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 回答