Сценарий Bash для поиска максимального количества определенных символов ("." )в любой отдельной строке файла

В Руководстве администратора ядра указано, что параметр quietотключает «большинство» сообщений журнала. Возможно, вам придется использовать параметр loglevel=0дополнительно, как предлагается здесь .

0
23.07.2020, 12:19
6 ответов

JAAOV (Еще один запутанный вариант awk...)

awk 'gsub(/[^.]/,"") { print | "wc -L" }'
0
18.03.2021, 23:17

Вы можете сделать это с помощьюawk:

awk '{gsub(/[^.]/,""); len=length(); if (len>max) {max=len}} END{printf("Largest count of \".\": %d\n",max)}' file.txt

Это заменит для каждой строки все символы, которые не ., на «ничего» (, т.е. удалит все, что не является.). Затем он подсчитает длину оставшейся строки и сохранит наибольшее значение, найденное в max. В конце -файла -он распечатает результат.

3
18.03.2021, 23:17

Кроме того, вы можете подсчитать количество определенных символов и оставить текст без изменений для дальнейшей обработки, такой как печать самой строки или подсчет другого символа. gsub возвращает количество замен.

awk '{ nDot = gsub ("[.]", "."); etc.. }'
3
18.03.2021, 23:17

awk -меньше ответа:

sed 's/[^.]//g' test.dat | wc -L

Другими словами, оставьте только точки и используйте параметр -L для wc:-L, --max-line-length: print the maximum display width

.
3
18.03.2021, 23:17

Давайте создадим пример,

cat >file <<'X'
this.world.
this
1.2.3.4.5
all.is.done
X

Сperl

perl -e 'while (<>) { $x = $n if ($n = ($_ =~ y/.//)) > $x } print "$x\n"' file
4

Сawk

awk '{ gsub("[^.]", ""); if ((n = length($0)) > x) { x = n } } END { print x }' file
4

С trи не -расширенной версией POSIXwc

tr -cd '.\n' <file | wc -L
4
2
18.03.2021, 23:17

Один из способов с awkможет быть следующим. Нам нужно понять, что имеет место следующее равенство:

  • number of fields = number of delimiters + 1

Обратите внимание, что добавление 0к операнду при арифметическом сравнении, хотя и не всегда необходимое, является хорошей практикой для внедрения. По крайней мере, это помогает мне думать об одной вещи меньше, потому что это становится действием авторефлекторного кодирования. Поскольку в Awkне предусмотрены отдельные операторы для арифметического сравнения и сравнения строк, следовательно, требуется приведение, чтобы помочь устранить неоднозначность строки из математического операнда или, скорее, из контекста.

$ awk -F '[.]' '
    NF>m+0 {m=NF}
    END {print --m}
' file
4
$ awk '
    gsub(/[^.]+/, "") &&
    ! index(t, $0) { t = $0 }
    END { print length(t) }
' file
$ perl -lne '
    my $k = tr/.//;
    $k > $m and $m = $k;
    }{ print $m+0;
' file

Редактор GNU sedтакже можно использовать вместе с утилитой двоичного калькулятора bc. Идея состоит в том, что мы сохраняем строки очищенными от всех точек, отличных от -, а текущая самая длинная строка чистых точек удерживается. В eofмы преобразуем точки в действенный код bc, чтобы сгенерировать количество этих точек.

$ sed -Ee '
    s/[^.]+//g;G
    /^(.*)..*\n\1$/!ba
    s/\n.*//;h;:a
    $!d;g;s/./1+/g;s/$/0/
'  file | bc -l
1
18.03.2021, 23:17

Теги

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