在awk中使用$ 1和$ 2

时间:2012-06-21 22:31:12

标签: awk

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

输入文件

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

CODE

 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

6 个答案:

答案 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