【发布时间】: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