【问题标题】:How do I count number of matched terms and return a value of zero if they don't match?如何计算匹配项的数量并在不匹配时返回零值?
【发布时间】:2013-12-05 19:31:58
【问题描述】:

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

输入列表:

+ 5S_rRNA
+ 7SK
+ AC001
+ 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

我想创建一个输出文件,其中包含所有不匹配的术语和具有相应计数的匹配术语,如下所示:

+ 5S_rRNA   3
+ 7SK   2
+ AC001 0
+ AADAC 1
+ AC000111.3    1
+ AC000111.6    0

我可以创建一个包含匹配项和计数的输出文件,但是如果没有匹配项,我不知道如何获取要返回的零值并将所有输出打印到单独的文件中。 这些是我用来创建匹配术语的代码(感谢 perreal 和 Mark Setchell)

#!/bin/bash
 while read line
do
   line=${line##+ }       # Strip off leading + and space
   n=$(grep "$line" data.txt 2> /dev/null | wc -l)
   if [ $n -gt 0 ]; then
      echo $line 
      echo $n
       fi
 done < input_list.txt > output.txt

cut -d' ' -f2 input.txt | grep -o -f - data.txt | sort | uniq -c | \
  sed 's/\s*\([0-9]*\)\s*\(.*\)/+ \2\t\1/' > output.txt

任何建议都会很棒。谢谢 哈丽特

【问题讨论】:

  • 您是否真的在输出中期待+ AADAC 1,或者这是一个错字?

标签: regex unix if-statement grep


【解决方案1】:

您可以将这个简单的循环与grep -c 一起使用:

while read l; do echo -n "+ $l "; grep -c "$l" file1; done < inputs
+ 5S_rRNA 3
+ 7SK 2
+ AC001 0
+ AC000111.3 1
+ AC000111.6 0

【讨论】:

    【解决方案2】:
    cut -d' ' -f2 input.txt | grep -o -f - data.txt | sort | uniq -c | \
        sed 's/\s*\([0-9]*\)\s*\(.*\)/+ \2 \1/' | \
        join -a 1 -e 0 -j 2 input.txt - -o '1.2 2.3' | \
        sed 's/ /\t/;s/^/+ /'
    

    【讨论】:

      【解决方案3】:

      使用制表符、空格或类似的分隔文件时,请考虑awk。也许这就是你要找的。我使用了ternary operator,但如果您觉得它们更易于阅读,您可以使用if / else 语句。

      awk 'FNR==NR { a[$4]++; next } { print "+", $2, $2 in a ? a[$2] : 0 }' data.txt inputlist.txt
      

      结果:

      + 5S_rRNA 3
      + 7SK 2
      + AC001 0
      + AC000111.3 1
      + AC000111.6 0
      

      $2 in a ? a[$2] : 0 表示如果第二列在数组中(称为a),则返回该键的值。否则,返回零。 HTH。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 2020-02-03
        相关资源
        最近更新 更多