Я хочу считать строки между "X" s. Это - просто пример; я должен применить код к сложному биологическому результату. Я буду благодарен, если можно предложить некоторую команду, предпочтительно с помощью awk
, grep
или sed
поскольку я знаком с теми.
Пример:
X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X
Желаемый вывод:
3
4
1
С awk
:
$ awk '!/X/{count++}/X/{print count; count = 0}' input
3
4
1
Инкремент счет для каждой строки, не содержащей X
; печать и сброс счет для строк, содержащих X
.
$ awk '/X/ && prev{print NR-prev-1} /X/{prev=NR}' file
3
4
1
, Как это работает:
Awk неявно прочитывает входные файлы линию за линией.
/X/ && prev{print NR-prev-1}
Для любая строка, которая содержит X
и если мы ранее присвоили значение prev
, затем распечатайте количество текущей строки, NR
, минус prev
минус одна.
/X/{prev=NR}
Для любой строки, которая содержит X
, устанавливает переменную prev
на текущий номер строки, NR
.
Другой простой awk
подход, который работает над демонстрационными данными OP и если X
не был в первом или даже в последнем или повторном Xs.
awk -v RS='X' 'NF{print NF}' infile
Выше корректно, когда существует только одно поле в каждой строке с FS по умолчанию, любые пробелы, иначе ниже пересмотрен в общем случае для подсчета linewise. Можно ввести ШАБЛОН вместо X там.
awk -F'\n' -v RS='X' 'NF>2{print NF-2}'
Демонстрационный вход:
X
Y YYY Y
YY
YY Y YY YY Y Y
X
Y Y Y
X
Y
Y
X
X
Вывод:
3
1
2
Большинство ответов здесь соответствует содержанию строки, которая будет считаться с помощью регулярных выражений, встроенных в программу Awk. Если необходимо соответствовать строкам содержанию, которое может содержать специальные символы (или к Awk или к регулярным выражениям), было бы лучше на самом деле сравнить строки для равенства. Поэтому я предлагаю следующий сценарий Awk как вариант ответа muru:
BEGIN {
count = 0;
}
{
if ($0 == needle) {
if (count) {
print count;
count = 0;
}
} else {
count++;
}
}
Сохраните его как текстовый файл, например. count-rows.awk
, и вызовите его следующим образом:
awk -f count-rows.awk -v needle=X input
Можно скорректировать значение needle
к Вашей симпатии. Преимущество этого метода состоит в том, что можно вызвать программу из сценария оболочки с произвольным значением для needle
не выходя из проблем:
awk -f count-rows.awk -v needle="$needle" input