Линии графа между “х”

Я получил подробную статью, как ее реализовать, это поможет http://planetghost.com/forums/drupal/multi-server-setup-image-upload-issue

13
задан 8 September 2017 в 15:02

12 ответов

С awk:

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

3
4
1

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

13
ответ дан 22 May 2018 в 18:40
  • 1
    Если первая строка не была X, первое число строк все равно будет подсчитываться и выводиться с этим решением, пока не будет сопоставлена ​​первая строка с X. EX (Невозможно добавить новые строки в комментарии, но подумайте, есть ли новая строка между каждым символом; P): Y X Y Y X Y Y Y будет выводить: 1 2 – Dan 8 September 2017 в 10:00
  • 2
    @muru это не сработает, если не было конца X (нужно добавить END{if (count)print count}) и создать пустую строку, где X был в начале, чтобы вы не могли добавить /X/&&count в состояние также – αғsнιη 8 September 2017 в 11:19
  • 3
    Хех. Один комментарий жалуется, что ведущие Y s не должны учитываться, потому что они не совсем между двумя X s; другой жалуется, что конечные Y s не учитываются, потому что они не совсем между двумя X s. Я буду ждать, когда ОП уточнит, если потребуется; Я в порядке с этим ответом, как и до этого. – muru 8 September 2017 в 11:27

С awk:

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

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

13
ответ дан 18 July 2018 в 07:13

С awk:

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

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

13
ответ дан 24 July 2018 в 18:45
$ 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
ответ дан 22 May 2018 в 18:40
  • 1
    Хорошо, хорошо. Злоупотребление NR дает мне представление: awk '/X/{print NR - 1; NR = 0}' foo – muru 8 September 2017 в 09:54
  • 2
    Спасибо, он дает мне точную информацию. что требуется. – Rhea 8 September 2017 в 10:00
  • 3
    Muro: Nice & amp; сложно. За исключением печати одного значения слишком много, оно работает для меня под gawk и mawk. Мне любопытно, гарантировано ли это поведение. @EdMorton? – John1024 8 September 2017 в 10:01
  • 4
    @rhea Если ваша первая строка не всегда X, есть небольшая разница в выходе между двумя ответами, как я объяснил в комментарии по запросу муру. – Dan 8 September 2017 в 10:05
  • 5
    @ John1024 спасибо! Надеюсь, это поможет мне. – Rhea 8 September 2017 в 10:14

Другой простой подход awk, который работает с образцовыми данными OP, и если X не был первым или даже последним или повторным Xs.

awk -v RS='X' 'NF{print NF}' infile

Выше правильное, когда есть только один поле в каждой строке с по умолчанию FS любые пробелы, в противном случае ниже в общем случае пересматривается для подсчета строки. Вы можете ввести свой PATTERN вместо 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
ответ дан 22 May 2018 в 18:40

Большинство ответов здесь соответствуют содержимому строки, которая должна учитываться с помощью регулярных выражений, встроенных в программу Awk. Если вам нужно сопоставить строки с контентом, который может содержать специальные символы (либо Awk, либо регулярные выражения), было бы лучше сравнить строки для равенства. Поэтому я предлагаю следующий сценарий Awk как вариант ответа муру:

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
ответ дан 22 May 2018 в 18:40

большинство ответов здесь соответствует содержанию линии должны быть подсчитаны, используя регулярные выражения встроены в программу на awk. Если вам нужно, чтобы соответствовать линии с контентом, который может содержать специальные символы (либо awk или регулярных выражений) лучше бы на самом деле сравнение строк на равенство. Поэтому я предлагаю следующий скрипт на awk как вариант ответа Муру по:

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

Вы можете отрегулировать значение [F5], чтобы вашему вкусу. Преимущество этого метода заключается в том, что вы можете вызвать программу из скрипта оболочки с произвольным значением для needle без экранирования вопросы:

awk -f count-rows.awk -v needle="$needle" input
1
ответ дан 18 July 2018 в 07:13
$ 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
ответ дан 18 July 2018 в 07:13

Другой простой подход awk, который работает с образцовыми данными OP, и если X не был первым или даже последним или повторным Xs.

awk -v RS='X' 'NF{print NF}' infile

Выше правильное, когда есть только один поле в каждой строке с по умолчанию FS любые пробелы, в противном случае ниже в общем случае пересматривается для подсчета строки. Вы можете ввести свой PATTERN вместо 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
ответ дан 18 July 2018 в 07:13

Большинство ответов здесь соответствуют содержимому строки, которая должна учитываться с помощью регулярных выражений, встроенных в программу Awk. Если вам нужно сопоставить строки с контентом, который может содержать специальные символы (либо Awk, либо регулярные выражения), было бы лучше сравнить строки для равенства. Поэтому я предлагаю следующий сценарий Awk как вариант ответа муру:

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
ответ дан 24 July 2018 в 18:45
$ 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
ответ дан 24 July 2018 в 18:45
  • 1
    Хорошо, хорошо. Злоупотребление NR дает мне представление: awk '/X/{print NR - 1; NR = 0}' foo – muru 8 September 2017 в 09:54
  • 2
    Спасибо, он дает мне точную информацию. что требуется. – Rhea 8 September 2017 в 10:00
  • 3
    Muro: Nice & amp; сложно. За исключением печати одного значения слишком много, оно работает для меня под gawk и mawk. Мне любопытно, гарантировано ли это поведение. @EdMorton? – John1024 8 September 2017 в 10:01
  • 4
    @rhea Если ваша первая строка не всегда X, есть небольшая разница в выходе между двумя ответами, как я объяснил в комментарии по запросу муру. – Dan 8 September 2017 в 10:05
  • 5
    @ John1024 спасибо! Надеюсь, это поможет мне. – Rhea 8 September 2017 в 10:14

Другой простой подход awk, который работает с образцовыми данными OP, и если X не был первым или даже последним или повторным Xs.

awk -v RS='X' 'NF{print NF}' infile

Выше правильное, когда есть только один поле в каждой строке с по умолчанию FS любые пробелы, в противном случае ниже в общем случае пересматривается для подсчета строки. Вы можете ввести свой PATTERN вместо 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
ответ дан 24 July 2018 в 18:45

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

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