Как я могу получить grep -n -o для печати номера строки для совпадений, встречающихся в той же строке? - PullRequest
0 голосов
/ 21 января 2020

Я ищу файл, содержащий последовательности в каждой строке. Я хочу выполнить grep для каждой строки, содержащей 'C', и вывести номер строки: C.

Вот что я пробовал до сих пор:

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

Out:

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

et c ...

Документация, которую я нашел в Интернете, предполагает, что это уже должно происходить с опцией -n, поэтому я думаю, что мне нужно изменить какую-то переменную окружения или настройку grep, но я не могу понять, что это такое. Я использую zsh оболочку на ОС Ma c.

Ответы [ 4 ]

3 голосов
/ 21 января 2020

Если вы в порядке с awk, это должно быть легкой задачей. Так как образцы не приведены, так что это не проверено, справедливое предупреждение.

awk '/>/{next} /c|C/{line=FNR} {print line":C"}'  Input_file
2 голосов
/ 21 января 2020

Вы можете использовать это awk для замены обеих grep команд:

awk -F '[Cc]' '!/>/ {for (i=1; i<NF; i++) print NR ":" FS}' chr22.fa
1 голос
/ 22 января 2020

GNU grep производит вывод, который вы ищете. В отличие от этого, BSD grep не выводит номер строки для дополнительных -o совпадений в той же строке.

Попробуйте команду ggrep или установите GNU grep.

1 голос
/ 22 января 2020

Анализ кода в OP показывает, что файл fasta обрабатывается. Я предполагаю, что номер строки, на которую ссылается OP, на самом деле означает порядковый номер. Кроме того, OP, скорее всего, работает с однострочными последовательностями. Предполагая, что истинный вопрос:

Учитывая файл , как я могу вернуть порядковый номер последовательности, содержащей букву "C" или "c" ?

В этом случае ответом будет:

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

Если ОП также интересуется общим временем появления этого символа, он может сделать:

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

Если OP будет обрабатывать быстрые файлы, где последовательности охватывают несколько строк, строки awk будут:

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", так как это немного странно, печатать то, что вы ищете.

...