Подсчет соседних строк с разным началом

Это означает, что рассматриваемая файловая система была смонтирована во время выполнения проверки, fsckпришлось фактически изменить данные на -диске, чтобы исправить ошибку, и файловая система не может быть перемонтирована вручную без перезагрузки системы..

В основном это происходит, когда ошибки обнаруживаются (и исправляются )в корневой файловой системе. Если у вас нет действительно причудливой среды initramfs или восстановления, из которой вы проверяете файловую систему, вы запускаете корневую файловую систему во время ее проверки (, поэтому она монтируется только для чтения -).

Из соображений производительности ядро ​​не выполняет повторную проверку кэшированных метаданных для смонтированных файловых систем (, поскольку ничто (кроме fsckне должно изменять данные на -диске, кроме ядра для смонтированной файловой системы ), поэтому, если fsckнужно исправить некоторые из этих метаданных, необходимо либо уведомить ядро ​​(, что невозможно в большинстве UNIX-систем ), либо указать пользователю размонтировать файловую систему, а затем смонтировать это снова, чтобы заставить ядро ​​подобрать измененные метаданные. Единственный способ сделать это с корневой файловой системой — фактически перезапустить саму систему.

-1
01.10.2021, 21:53
4 ответа
$ awk -F':' '(NR>1) && ($1!=prev){c++} {prev=$1} END{print c+0}' file
2
5
02.10.2021, 04:03

Использованиеawk

$ awk -F"[a-z]|:" '! count[$7]++ {cnt++} END {print cnt + 0}' input_file
2

Подсчет уникального значения после слова Speaker, но перед:

0
02.10.2021, 05:16

В модуле Python itertoolsесть метод groupby, который группирует данные по ключам при каждом изменении значения ключа. Мы делаем первое поле разделенным двоеточием в качестве нашего ключа и группируем вокруг него.

python3 -c 'import sys, itertools as it
k,g = -1,lambda x: x.split(":")[0]
with open(sys.argv[1]) as f:
  for t in it.groupby(f,g): k += 1
print(k)
' file
2

GNU sedможет сделать это, просматривая две строки одновременно. Когда первые поля, разделенные двоеточием, различаются, мы добавляем к удержанию новую строку. В eof напечатайте удержание после удаления одной новой строки, чтобы учесть новую строку, неявно добавленную sed во время печати.

sed -En '
  $!N
  /^([^:]+:).*\n\1/!{x;s/$/\n/;x;}
  $!D
  g;s/.//p
' file|wc -l

Perl в режиме slurp (0777 ), используя силу регулярных выражений,удалить последовательные повторяющиеся строки с одинаковыми первыми полями, разделенными двоеточием. Затем подсчитайте количество новых строк.

perl -pl -0777 -e '
  s/^(([^:]+:).*\n)(?:\2.*\n)+/$1/mg;
  $_ = tr/\n// -1;
' file
1
02.10.2021, 06:59

Использование Raku (, ранее известного как Perl _6)

raku -e '(-1 + slurp.split(/<[:\v]>/)[0,2,4...*]>>.match(/\d+$/).[0..(*-2)]>>.Int.squish.elems).say;'

ИЛИ

raku -e '(-1 + slurp.comb(/ ^^ \w+ <(\d+)> \: \s /).squish.elems).say;'

Кратко (второе решение, выше ), slurpфайл, combвыбрать элементы, соответствующие (в порядке)^^начало -строки -, \w+alnum (s ), \:двоеточие и \sпробел, с помощью оператора <(…)>отбросить все, кроме цифр, squishсмежные одинаковые цифры, оставив только одну, получить количество elemsэлементов, затем-1(вычесть единицу )и sayответ.

Образец ввода (OP, продублированные 2 раза):

Speaker1: Hello. 
Speaker2: Hi. 
Speaker2: How are you? 
Speaker1: Well thanks..
Speaker1: Hello. 
Speaker2: Hi. 
Speaker2: How are you? 
Speaker1: Well thanks..
Speaker1: Hello. 
Speaker2: Hi. 
Speaker2: How are you? 
Speaker1: Well thanks..

Пример вывода(perl6 -e 'slurp.comb(/ ^^ \w+ <(\d+)> \: \s /).say;')

(1 2 2 1 1 2 2 1 1 2 2 1)

Пример вывода(perl6 -e 'slurp.comb(/ ^^ \w+ <(\d+)> \: \s /).squish.say;')

(1 2 1 2 1 2 1)

Пример вывода (окончательный,вторая строка кода сверху):

6

https://raku.org

0
03.10.2021, 21:54

Теги

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