正如我在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
答案 0 :(得分: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
答案 1 :(得分: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 :(得分:1)
如果要将脚本限制为仅包含“session”和“customer”,您只需将正则表达式添加到主脚本中作为选择器:
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]}}'
答案 3 :(得分: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
答案 4 :(得分:0)
然而另一种选择是
awk -F "=" '$1 ~ /customer|session/ {print $1}'|sort |uniq -c | awk '{print "Count of unique "$2"="$1}'
答案 5 :(得分: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