use*_*573 5 unix perl grep match
我试图计算输入列表中匹配项的数量,该列表包含每行一个术语和一个数据文件,并创建一个包含匹配(grep'd)项和匹配数的输出文件.
input_list.txt如下所示:
+ 5S_rRNA
+ 7SK
+ AADAC
+ AC000111.3
+ AC000111.6
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我想创建一个输出文件(output.txt),其中包含匹配的术语及其相应的计数.
+ 5S_rRNA 3
+ 7SK 2
+ AADAC 1
+ AC000111.3 1
+ AC000111.6 1
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经使用以下脚本生成了包含所有匹配术语的列表,但是所有提供匹配术语计数的尝试都没有奏效.
exec < input_list.txt
while read line
do
grep -w data.txt | awk '{print $0}'| sort| uniq >> grep_output.txt
done
Run Code Online (Sandbox Code Playgroud)
我已经尝试了grep -o -w | wc -l and grep -w data.txt | wc -l
但是我无法弄清楚如何生成包含匹配术语及其相应计数的输出列表.
任何建议都会很棒!
你可以从input.txt中搜索单词并使用uniq来获取计数:
cut -d' ' -f2 input.txt | grep -o -f - data.txt | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
得到:
3 5S_rRNA
2 7SK
1 AADAC
1 AC000111.3
1 AC000111.6
Run Code Online (Sandbox Code Playgroud)
您还可以添加另一个sed来获取格式化输出:
cut -d' ' -f2 input.txt | grep -o -f - data.txt | sort | uniq -c | \
sed 's/\s*\([0-9]*\)\s*\(.*\)/+ \2\t\1/'
Run Code Online (Sandbox Code Playgroud)
生产:
+ 5S_rRNA 3
+ 7SK 2
+ AADAC 1
+ AC000111.3 1
+ AC000111.6 1
Run Code Online (Sandbox Code Playgroud)