在awk中使用$1和$2

在awk中使用$1和$2,awk,Awk,正如我在awk中所知道的,$1和$2引用文件的第一个和第二个字段。但是$1和$2可以用来引用变量的第一个和第二个字段吗。。这样,如果会话=5,则存储在变量中。那么,我想要1美元,指的是“会话”,2美元指的是“5”。多谢各位 输入文件 代码 细节 我将通过xargs传递我从第一个获得的输出,并通过管道将其传输,然后在xargs中的“name”变量中读取行。。现在,我的$1应该对应于xargs的第一个字段,这是我的查询 输出 为什么不试试全awk解决方案呢?更简单的是: awk -F "=" '$1

正如我在awk中所知道的,$1和$2引用文件的第一个和第二个字段。但是$1和$2可以用来引用变量的第一个和第二个字段吗。。这样,如果会话=5,则存储在变量中。那么,我想要1美元,指的是“会话”,2美元指的是“5”。多谢各位

输入文件 代码 细节 我将通过xargs传递我从第一个获得的输出,并通过管道将其传输,然后在xargs中的“name”变量中读取行。。现在,我的$1应该对应于xargs的第一个字段,这是我的查询

输出
为什么不试试全
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