linux - 使用 awk 计算另一个文件中模式出现的次数

标签 linux bash awk

我正在尝试获取一个包含列表的文件并计算该列表中的项目在目标文件中出现的次数。就像是:

list.txt
blonde
red
black

target.txt
bob blonde male
sam blonde female

desired_output.txt
blonde 2
red 0
black 0
我选择了以下代码来获取存在于 target.txt 中的值:
awk '{count[$2]++} END {for (word in count) print word, count[word]}' target.txt
但是输出不包括在 liist.txt 但不包括在 target.txt 中的所需项目
current_output.txt
blonde 2
我已经尝试了一些事情来让这个工作,包括:
awk '{word[$1]++;next;count[$2]++} END {for (word in count) print word, count[word]}' list.txt target.txt
但是,我没有成功。
任何人都可以帮助我使这个 awk 语句读取 key.txt 文件吗?对代码的任何解释也将不胜感激。
谢谢!

最佳答案

awk '
  NR==FNR{a[$0]; next}
  {
    for(i=1; i<=NF; i++){
      if ($i in a){ a[$i]++ }
    }
  }
  END{
    for(key in a){ printf "%s %d\n", key, a[key] }
  }
' list.txt target.txt
  • NR==FNR{a[$0]; next}条件 NR==FNR 仅适用于第一个文件,所以
    数组的键 alist.txt 的行.
  • for(i=1; i<=NF; i++)现在对于第二个文件,这将遍历所有
    它的领域。
  • if ($i in a){ a[$i]++ }这将检查字段 $i 是否作为 key 出现
    在数组中 a .如果是,则与该键关联的值(初始为零)递增。

  • END ,我们只打印 key后跟出现次数 a[key]和一个换行符( \n )。

  • 输出:
    blonde 2
    red 0
    black 0
    
    笔记:
  • 因为%d , printf语句强制转换 a[key]一个整数,以防它仍然未设置。整个语句可以替换为更简单的 print key, a[key]+0 .我在写答案时错过了这一点,但现在您知道做同一件事的两种方法。 ;)
  • 在您的尝试中,出于某种原因,您只处理字段 2 ( $2 ),而忽略了其他列。
  • 关于linux - 使用 awk 计算另一个文件中模式出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64723154/

    相关文章:

    c - Linux rs232 读取 - 选择调用似乎会阻塞,直到不再发送数据

    linux - 将视频与入点/出点拼接在一起

    linux - 在 Jenkins 管道作业中将变量传递给 bash 脚本

    regex - 进行各种替换,但只能在字符之前

    bash - 如何在 shell 上删除早于 x 秒(不是天、小时或分钟)的文件?

    python - 我需要直接打印匹配字符串之后的内容

    linux - 使用自定义 header 编译 Linux 内核模块

    c - 定时器和信号中的问题

    bash - 在 osx 中使用 xargs 接受 fswatch 中更改文件的名称

    shell - Unix连接两个文件的多个字段