【问题标题】:Using grep with pattern file to count individual pattern matches in a file使用 grep 和模式文件来计算文件中的单个模式匹配
【发布时间】:2023-03-14 20:42:01
【问题描述】:

我将 grep 与具有多个搜索模式的文件一起使用。作为输出,我想获取匹配模式以及该特定模式的出现次数。

cat pattern.txt

AT3G09260.1
AT5G50920.1

输入文件如下所示

>AT2G44750.1 | Symbols: TPK2 | thiamin pyrophosphokinase 2 | chr2:18451510-18452754 FORWARD LENGTH=265
>AT2G47140.1 | Symbols:  | NAD(P)-binding Rossmann-fold superfamily protein | chr2:19350970-19352059 REVERSE LENGTH=257
>AT2G47120.1 | Symbols:  | NAD(P)-binding Rossmann-fold superfamily protein 
>AT1G21470.1 | Symbols:  | BEST Arabidopsis thaliana protein match is: CLPC homologue 1 (TAIR:AT5G50920.1); Has 326 Blast hits to 324 proteins in 95 species: Archae - 0; Bacteria - 130; Metazoa - 0; Fungi - 0; Plants - 67; Viruses - 0; Other Eukaryotes - 129 (source: NCBI BLink). | chr1:7516709-7517179 REVERSE LENGTH=118
>AT3G09260.1 | Symbols: PYK10, PSR3.1, BGLU23, LEB | Glycosyl hydrolase superfamily protein | chr3:2840657-2843730 REVERSE LENGTH=524
>AT5G48175.1 | Symbols:  | FUNCTIONS IN: molecular_function unknown; INVOLVED IN: biological_process unknown; LOCATED IN: endomembrane system; EXPRESSED IN: hypocotyl, male gametophyte, root; BEST Arabidopsis thaliana protein match is: Glycosyl hydrolase superfamily protein (TAIR:AT3G09260.1); Has 30201 Blast hits to 17322 proteins in 780 species: Archae - 12; Bacteria - 1396; Metazoa - 17338; Fungi - 3422; Plants - 5037; Viruses - 0; Other Eukaryotes - 2996 (source: NCBI BLink). | chr5:19539208-19539676 FORWARD LENGTH=115
>AT5G50920.1 | Symbols: CLPC, ATHSP93-V, HSP93-V, DCA1, CLPC1 | CLPC homologue 1 | chr5:20715710-20719800 REVERSE LENGTH=929

我想得到类似的东西

AT3G09260.1    2
AT5G50920.1    2

我试过了

grep -f pattern.txt -c inputfile.txt
4

但它只给了我匹配行的总数(对于所有模式)。 我相信这个问题已经在这里问过了,但从未解决过

how to loop over pattern from a file with grep

谢谢。

【问题讨论】:

  • 为什么写了却没有解决?这个问题已经回答了
  • 提供的 awk 脚本没有给出所需的输出

标签: bash grep


【解决方案1】:

您基本上需要 grep -o 它将仅打印匹配的组,然后您可以像这样使用 sort 和 uniq 简单地找到它们的计数

$ grep -of pattern_file input_file | sort | uniq -c
      2 AT3G09260.1
      2 AT5G50920.1

如果你想交换订单,那么你可以像这样使用awk

$ grep -of pattern_file input_file | sort | uniq -c | awk '{print $2,$1}'
AT3G09260.1 2
AT5G50920.1 2

或者简单地使用 awk

$ awk 'FNR==NR{a[$1]=0; next} { for(i in a) {a[i]+=gsub(i,"")} } END{for(i in a){ print i, a[i]} }' pattern_file RS= input_file
AT5G50920.1 2
AT3G09260.1 2

【讨论】:

  • 太好了,grep 和 awk 都可以完美运行。谢谢。
【解决方案2】:

遵循 awk 可以帮助您,因为您的 Input_file 看起来没有任何行的多个计数,因此无法测试您的输出。

awk '{a[$0]++} END{for(i in a){print i,a[i]}}'  Input_file

【讨论】:

    【解决方案3】:

    试试

    grep -f pattern.txt inputfile.txt| cut -d'|' -f1 |sort | uniq -c

    这将从您的文件中 grep 匹配的行,然后提取 ID(第一个管道符号之前的所有内容,对它们进行排序,然后计算每个的唯一出现次数。

    【讨论】:

    • grep 返回无法轻松排序的整行,因此无法正常工作 - 将使用输入文件的详细信息编辑我的问题以使其更清晰
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多