gpt4 book ai didi

linux - 使用 awk 命令计数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:18 28 4
gpt4 key购买 nike

我有 fileA.txt,其中的几行如下所示:

AA
BB
CC
DD
EE

我有 fileB.txt,它的文本如下所示:

Group  col2   col3    col4
1 pp 4567 AA,BC,AB
1 qp 3428 AA
2 pp 3892 AA
3 ee 28399 AA
4 dd 3829 BB,CC
1 dd 27819 BB
5 ak 29938 CC

对于fileA.txt中的每一行,它应该根据fileB.txt中的column1计算它在fileB.txt中出现的次数。

示例输出应如下所示:

AA    3
BB 2
CC 2

AA 出现了 4 次,但它在组“1”中出现了两次。如果它在 column1 的同一组中出现不止一次,它应该只被计算一次,因此在上面的输出中 AA 计数为 3。

对使用 awk 或任何其他 oneliner 有帮助吗?

最佳答案

这是一个应该可以工作的 awk 单行代码:

awk '
NR==FNR && !seen[$4,$1]++{count[$4]++;next}
($1 in count){print $1,count[$1]}' fileB.txt fileA.txt

解释:

  • NR==FNR&&!seen[$4,$1]++ 模式仅在根本未捕获第 1 列时为真。对于所有重复捕获,我们不会增加计数器。
  • $1 in count 在数组中查找第一个文件第 1 列。如果存在,我们将连同计数一起打印。

输出:

$ awk 'NR==FNR && !seen[$4,$1]++{count[$4]++;next}($1 in count){print $1,count[$1]}' fileB.txt fileA.txt
AA 3
BB 2
CC 1

根据修改后的问题更新:

awk '
NR==FNR {
n = split($4,tmp,/,/);
for(x = 1; x <= n; x++) {
if(!seen[$1,tmp[x]]++) {
count[tmp[x]]++
}
}
next
}
($1 in count) {
print $1, count[$1]
}' fileB.txt fileA.txt

输出:

AA 3
BB 2
CC 2

关于linux - 使用 awk 命令计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22156972/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com