perl - 计算文本文件中匹配术语的数量?

标签 perl unix grep match

我正在尝试从包含一个数据文件的每行一个术语的输入列表中计算匹配术语的数量,并创建一个包含匹配(grep'd)术语和匹配数量的输出文件。

input_list.txt 看起来像这样:

+ 5S_rRNA
+ 7SK
+ AADAC
+ AC000111.3
+ AC000111.6

data.txt 文件:
chr10   101780038   101780209   5S_rRNA
chr10   103578280   103578430   5S_rRNA
chr10   112327234   112327297   5S_rRNA
chr10   120766459   120766601   7SK
chr10   127408228   127408317   7SK
chr10   127511874   127512063   AADAC
chr10   14614140    14614294    AC000111.3
chr10   14695964    14696146    AC000111.6

我想创建一个包含匹配项及其相应计数的输出文件 (output.txt)。
+ 5S_rRNA   3
+ 7SK   2
+ AADAC 1
+ AC000111.3    1
+ AC000111.6    1

到目前为止,我已经使用以下脚本生成了一个包含所有匹配术语的列表,但所有提供匹配术语计数的尝试都没有奏效。
    exec < input_list.txt
    while read line
    do
                grep -w data.txt | awk '{print $0}'| sort| uniq  >> grep_output.txt
    done

我试过 grep -o -w | wc -l and grep -w data.txt | wc -l等等,但我无法弄清楚如何生成包含匹配项及其相应计数的输出列表。

任何建议都会很棒!

最佳答案

您可以从 input.txt 中 grep 单词并使用 uniq 获取计数:

cut -d' ' -f2 input.txt | grep -o -f - data.txt | sort | uniq -c

给出:
  3 5S_rRNA
  2 7SK
  1 AADAC
  1 AC000111.3
  1 AC000111.6

您还可以添加另一个 sed 以获取格式化输出:
cut -d' ' -f2 input.txt | grep -o -f - data.txt | sort | uniq -c | \
      sed 's/\s*\([0-9]*\)\s*\(.*\)/+ \2\t\1/'

产生:
+ 5S_rRNA   3
+ 7SK   2
+ AADAC 1
+ AC000111.3    1
+ AC000111.6    1

关于perl - 计算文本文件中匹配术语的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20348578/

相关文章:

perl - 制作散列的散列

Perl/LibXML : keep closing tags when serializing

linux - 如何在 nslcd.service 之后启动 docker.service?

linux - grep 是如何制作颜色的?

linux - 在每行之间添加额外的换行符

php - 使用 PHP 调用 Perl 脚本,传递变量并将结果放入文件中

perl - 为什么对于包含非 ASCII 字符的文件名,-e 文件存在性测试总是返回 false?

linux - 搜索字符串的标准命令

linux - 需要在 Windows korn shell 中运行 ksh 脚本

grep 中的正则表达式查找字符串中的非数字字符