在awk中使用$1和$2
正如我在awk中所知道的,$1和$2引用文件的第一个和第二个字段。但是$1和$2可以用来引用变量的第一个和第二个字段吗。。这样,如果会话=5,则存储在变量中。那么,我想要1美元,指的是“会话”,2美元指的是“5”。多谢各位 输入文件 代码 细节 我将通过xargs传递我从第一个获得的输出,并通过管道将其传输,然后在xargs中的“name”变量中读取行。。现在,我的$1应该对应于xargs的第一个字段,这是我的查询 输出在awk中使用$1和$2,awk,Awk,正如我在awk中所知道的,$1和$2引用文件的第一个和第二个字段。但是$1和$2可以用来引用变量的第一个和第二个字段吗。。这样,如果会话=5,则存储在变量中。那么,我想要1美元,指的是“会话”,2美元指的是“5”。多谢各位 输入文件 代码 细节 我将通过xargs传递我从第一个获得的输出,并通过管道将其传输,然后在xargs中的“name”变量中读取行。。现在,我的$1应该对应于xargs的第一个字段,这是我的查询 输出 为什么不试试全awk解决方案呢?更简单的是: awk -F "=" '$1
为什么不试试全
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使用字段分隔符,它可以在开始代码块内指定为
FS=“Separator”
,或者通过-F“Separator”
作为awk
的命令行选项。此答案仅显示问题提出的点。它不处理最终输出
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
如果您要查找的是一些独特的客户和会话,那么这可能会:
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
除了保留一个计数,这还保留了一个关联数组,其中包含一个参与计数的行,以避免第二次对行进行计数,从而使其成为唯一的计数。如果要将脚本限制为仅包含“会话”和“客户”,则只需将正则表达式作为选择器添加到主脚本中:
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]}}'
但另一种选择是
awk -F "=" '$1 ~ /customer|session/ {print $1}'|sort |uniq -c | awk '{print "Count of unique "$2"="$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]
}
}
}
}
你能提供支持的源代码使这个小片段变得有意义吗?你必须在一个动作中重新定义FS和$0来做类似的事情。我将用实际的脚本编辑这个问题。请参考它。你能看一下code@user-在示例数据中,
会话
行等于123,所以只有一个唯一的会话值。我是awk新手,因此我尝试了xargs。。无论如何,我会努力做到这一点。。多谢了,多谢各位。。我得到了我想要的结果needed@ghoti值得投反对票吗?这在很大程度上取决于op所称的unique
。他没有询问unique id。他问起了关于场分离器的事。我给他看了场地分隔符,即1美元和2美元。(我现在已经从粘贴的最后一行中删除了单词Unique)谢谢。。。有一个词我大约50%的时候是对的:)。。。e太多,a不够;这很可能是我需要的心理联想。。。
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]}}'
awk -F "=" '$1 ~ /customer|session/ {print $1}'|sort |uniq -c | awk '{print "Count of unique "$2"="$1}'
#!/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