Awk 如何让grep-n-o打印同一行上发生的匹配的行号?

Awk 如何让grep-n-o打印同一行上发生的匹配的行号?,awk,grep,zsh,gnu,fasta,Awk,Grep,Zsh,Gnu,Fasta,我正在搜索一个包含每行序列的文件。我想对包含“C”的每一行进行grep,并输出行号:C 以下是我迄今为止所尝试的: grep -v ">" chr22.fa | grep -o -n "[C|c]" | less 输出: 等等 我想要的是: 210201:C 210201:C 210201:C 210201:C 210202:C 210202:C 210202:C 210202:C 210202:C 210202:C 210202:C 210203:C 210203:C 210203

我正在搜索一个包含每行序列的文件。我想对包含“C”的每一行进行grep,并输出行号:C

以下是我迄今为止所尝试的:

grep -v ">" chr22.fa | grep -o -n  "[C|c]" | less 
输出:

等等

我想要的是:

210201:C
210201:C
210201:C
210201:C
210202:C
210202:C
210202:C
210202:C
210202:C
210202:C
210202:C
210203:C
210203:C
210203:C
210203:C
210203:C
210204:C
210204:C
210204:C
210204:C
210204:C
210204:C
等等

我在网上找到的文档表明,-n选项应该已经出现了这种情况,所以我认为有一些环境变量或grep设置需要更改,但我不知道它是什么。我正在Mac OS上使用zsh外壳。

如果您对awk没有问题,这应该是一项简单的任务。由于未提供样品,因此未对其进行测试,这是一个合理的警告

awk '/>/{next} /c|C/{line=FNR} {print line":C"}'  Input_file
您可以使用此awk替换两个grep命令:

awk -F '[Cc]' '!/>/ {for (i=1; i<NF; i++) print NR ":" FS}' chr22.fa

通过分析OP中的代码,似乎正在处理一个fasta文件。我假设OP引用的行号实际上是序列号。此外,OP最有可能用于单行序列。假设真正的问题是:

给定一个文件,如何返回包含字母C或C的序列号

在这种情况下,答案是:

awk '/>/{c++;next} match($0,/[cC]/) { print c }' file
awk '/>/{c++;p=1;next} p && match($0,/[cC]/) { print c; p=0 }' file
awk '/>/{if(n)print c,n;c++;n=0;next}{n+=gsub(/[cC]/,"c",$0)}END{if(n) print c,n}' file
如果OP也对该角色出现的总次数感兴趣,他可以:

awk '/>/{c++;next}(n=gsub(/[cC]/,"c",$0)) { print c,n }' file
如果OP将处理序列跨越多行的fasta文件,则awk行将为:

awk '/>/{c++;next} match($0,/[cC]/) { print c }' file
awk '/>/{c++;p=1;next} p && match($0,/[cC]/) { print c; p=0 }' file
awk '/>/{if(n)print c,n;c++;n=0;next}{n+=gsub(/[cC]/,"c",$0)}END{if(n) print c,n}' file

虽然这并不完全是OP所描述的,但这将打印序列号c以及字符c或c在序列中出现的总次数。这不会打印字母C,因为打印您正在搜索的内容有点奇怪。

GNU grep生成您正在寻找的输出。相比之下,BSD grep不会为同一行上的其他-o匹配输出行号


尝试使用ggrep命令或安装GNU grep。

在Linux上使用bash,我可以在不做任何修改的情况下获得所需的输出。你能试试bash或其他grep吗?我理解正确了吗?你真的想要序列号和C在序列中出现的总时间?是的。我想知道每行C出现的频率。这确实是个问题。谢谢你的洞察力!