Строки количества между “X” s

Я хочу считать строки между "X" s. Это - просто пример; я должен применить код к сложному биологическому результату. Я буду благодарен, если можно предложить некоторую команду, предпочтительно с помощью awk, grep или sed поскольку я знаком с теми.

Пример:

X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X

Желаемый вывод:

3
4
1
13
задан 8 September 2017 в 05:02

4 ответа

С awk:

$ awk '!/X/{count++}/X/{print count; count = 0}' input

3
4
1

Инкремент счет для каждой строки, не содержащей X; печать и сброс счет для строк, содержащих X.

13
ответ дан 23 November 2019 в 03:12
$ 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.

12
ответ дан 23 November 2019 в 03:12

Другой простой 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
6
ответ дан 23 November 2019 в 03:12

Большинство ответов здесь соответствует содержанию строки, которая будет считаться с помощью регулярных выражений, встроенных в программу 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
1
ответ дан 23 November 2019 в 03:12

Другие вопросы по тегам:

Похожие вопросы: