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

How can I get grep -n -o to print the line number for matches occurring on the same line?

我正在搜索每行都包含序列的文件。我想对包含 'C' 的每一行进行 grep 并输出行号:C.

这是我目前尝试过的方法:

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

输出:

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

等等...

我想要的是:

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 shell

如果您对 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 很可能适用于单行序列。假设真题是:

Given a file, how can I return the sequence number of the sequences containing the letter "C" or "c"?

在这种情况下,答案是:

awk '/>/{c++;next} match([=10=],/[cC]/) { print c }' file

如果OP也对这个角色出现的总次数感兴趣,他可以这样做:

awk '/>/{c++;next}(n=gsub(/[cC]/,"c",[=11=])) { print c,n }' file

如果 OP 将处理序列跨越多行的 fasta 文件,awk 行将是:

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

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

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

尝试 ggrep 命令或安装 GNU grep。