如何让 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 fasta 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
和字符 c
或 C
在序列中出现的总次数.这不会打印字母 "C"
,因为打印您要搜索的内容有点奇怪。
GNU grep 生成您正在寻找的输出。相比之下,BSD grep 不会输出同一行上额外 -o
匹配项的行号。
尝试 ggrep
命令或安装 GNU grep。
我正在搜索每行都包含序列的文件。我想对包含 '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.
如果您对 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 fasta 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
和字符 c
或 C
在序列中出现的总次数.这不会打印字母 "C"
,因为打印您要搜索的内容有点奇怪。
GNU grep 生成您正在寻找的输出。相比之下,BSD grep 不会输出同一行上额外 -o
匹配项的行号。
尝试 ggrep
命令或安装 GNU grep。