Я хочу посчитать строки между "X". Это всего лишь пример; Я должен применить код для сложного биологического результата. Я буду благодарен, если вы можете предложить какую-либо команду, желательно с использованием awk
, grep
или, sed
как я знаком с ними.
Пример:
X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X
Желаемый результат:
3
4
1
Ответы:
С
awk
:Увеличить счетчик для каждой строки, не содержащей
X
; распечатать и сбросить счетчик для строк, содержащихX
.источник
X
, первое число строк будет по-прежнему считаться и выводиться с этим решением, пока первая строка с неX
будет сопоставлена. EX (Невозможно добавить новые строки в комментариях, ноY X Y Y X Y Y Y
1 2
END{if (count)print count}
), и при создании пустой строки, где X был в начале, чтобы избежать, вы также можете добавить/X/&&count
в условииY
s не должны учитываться, потому что они не находятся точно между двумяX
s; другой жалуется, что конечныеY
s не учитываются, потому что они не находятся точно между двумяX
s. Я подожду, пока ОП уточнит, если нужно; Я в порядке с этим ответом, как это до тех пор.Как это устроено:
Awk неявно читает входные файлы построчно.
/X/ && prev{print NR-prev-1}
Для любой строки, которая содержит
X
и если мы ранее присвоили значениеprev
, выведите номер текущей строкиNR
, минусprev
минус один./X/{prev=NR}
Для любой строки, содержащей
X
, установить переменнуюprev
для текущего номера строки,NR
.источник
NR
дает мне представление:awk '/X/{print NR - 1; NR = 0}' foo
X
, есть небольшая разница в выводе между двумя ответами, как я объяснил в комментарии к ответу Муру.Другой простой
awk
подход, который работает с образцами данных OP, и еслиX
он не был в первом или даже в последнем или повторном X.Выше указано правильное значение, если в каждой строке имеется только одно поле с FS по умолчанию для любых пробелов , в противном случае ниже пересматривается в общем случае для подсчета линий . Вы можете ввести свой ШАБЛОН вместо X там.
Пример ввода:
Выход:
источник
Большинство ответов здесь соответствуют содержанию строки, которая будет подсчитана с использованием регулярных выражений, встроенных в программу Awk. Если вам нужно сопоставить строки с содержимым, которое может содержать специальные символы (либо в Awk, либо в регулярных выражениях), было бы лучше на самом деле сравнить строки на равенство. Поэтому я предлагаю следующий сценарий Awk как вариант ответа Муру :
Сохраните его как текстовый файл, например
count-rows.awk
, и вызовите его следующим образом:Вы можете настроить значение
needle
по своему вкусу. Преимущество этого метода в том, что вы можете вызывать программу из сценария оболочки с произвольным значением, чтобыneedle
избежать проблем:источник