Как я могу распечатать самое длинное количество в строке?

У меня была аналогичная ситуация в прошлом, и мой способ решить состоял в том, чтобы вынудить Солярис и Linux смонтировать NFS v3 вместо v4.

Со стороны Соляриса можно отредактировать/etc/default/nfs и установить переменные для стороны сервера к серверу и принять только сторону NFS v3.

Не может помнить имена переменных, но это сам объяснительное.

Тест Вы сделали действительно ли копирование, является единственным большим файлом или несколькими файлами? Если бы это - несколько файлов, я не был бы удивлением, но если это - единственный файл, чем да.

Кроме того, какую базовую систему хранения Вы имеете? отдельный диск? установка набега? это - также влияние Ваша производительность.

11
29.04.2014, 15:53
9 ответов
[118901]
7
27.01.2020, 19:56
[119119], я полагаю, что это можно сделать только с помощью [119546]grep[119547], [119548]sort[119549], и [119550]tail[119551], а также с помощью [119550] tail[119551]. Вот несколько примеров строк.

 $ nc proxy.example.com 8080
-> CONNECT mail.example.com:587 HTTP/1.0
->
<- HTTP/1.0 200 Connection Established
<- Proxy-agent: Apache/2.2.19 (Debian)
<-
<- 220 mail.example.com ESMTP Badger badger badger badger badger postfix postfix!
-> ehlo grawity-pc
<- 250-mail.example.com
<- 250-PIPELINING
<- 250-SIZE 10240000
<- 250-STARTTLS
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250 DSN
-> quit
<- 221 2.0.0 Bye
Где [119552][119553] - наша строка под вопросом.

Пример

Теперь, если я прогоню их через мою команду [119554]grep ...[119555] по очереди.

Этот подход работает путем выбора всех подстрок, которые являются последовательностями цифр. Затем мы сортируем этот вывод численно, [119556]сортируем -n[119557], а затем захватываем последнее значение в списке, используя [119558]хвост -1[119559]. Это будет самая длинная подстрока.

Вы можете посмотреть, как это работает, сняв хвост [119560]-1[119561] и перезапустив один из примеров:

  1. Строки, которые начинаются с нулей

  2. Вышеприведенный подход работает для каждой ситуации, которую я мог бы представить, кроме одной. [119562]@terdon упомянутый в чате[119563] сценарий, который сдерживает описанный выше подход.

  3. 00000000001

  4. 2

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

Результаты:

Можно немного сгущать, используя способность Бэша определять длину переменной, используя [119568]${#var}[119569].

Используя `grep -P

я решил использовать [119570]grep -P ...[119571] выше, потому что, будучи разработчиком Perl, я, как и синтаксис класса, говорящий все цифры так: [119572]\d+[119573], вместо [119574][[:цифра:]]\+[119575] или [119576][0-9] \+[119577]. Но для этой конкретной проблемы она на самом деле не нужна. Так же легко можно поменять местами grep [119578]grep[119579], который я использовал:

Например:

13
27.01.2020, 19:56
[119173] Решение в [119608]perl[119609]:

Ссылки

Преобразование Шварцца

Spoofing (of user identity)
Tampering
Repudiation
Information disclosure (privacy breach or Data leak)
Denial of Service (D.o.S.)
Elevation of privilege

8
27.01.2020, 19:56
[119117] Используя питон со строкой, переданной в командной строке и предполагая, что вам нужна первая последовательность максимальной длины:
7
27.01.2020, 19:56
[119299]Вот еще один подход на Perl, который может работать как с числами после запятой, так и с целыми:[12189]Обратите внимание, что ни один из уже опубликованных ответов не будет работать с числами после запятой, и так как вы указываете, что вам нужны самые длинные, а не самые большие числа, я предполагаю, что вам на самом деле [119767]нужны [119768] числа после запятой. [12190]Объяснение[12191]perl -lne[119912] : [119913]-n[119914] означает "чтение входной строки за строкой и выполнение на ней скрипта, заданного [119915]-e[119916]". С помощью [119917]-l[119918] к каждому вызову [119919]-n[119920] добавляется новая строка (и другие вещи, не относящиеся к делу).[12192]while(/([\d. ]+)/g)[119922] : итерация по всем номерам ([119923]\d[119924] означает [119925][0-9][119926], поэтому [119927][\d.][119928] будет соответствовать цифрам и [119929].[119930]. Если Вы также хотите найти отрицательные числа, добавьте [119931]-[119932]. В скобках указана соответствующая строка как [119933]$1[119934], которая используется на следующем шаге.[12193]$max=$1, если длина($1) > длина($max)[119936] : Если длина текущего совпадения больше самой длинной ([119937]$max[119938]), сохраните совпадение как [119939]$max[119940].[12194]распечатайте $max[119942] : распечатайте самую длинную из найденных строк чисел. Это будет выполнено [119943] после [119944] завершения цикла, то есть после того, как все числа будут найдены.[12195]
7
27.01.2020, 19:56
[119071]Given

  1. then in bash
  2. Возможно более чистое решение bash с использованием массива, построенного путем замены нецифровых символов в строке на пробелы, вместо grep
6
27.01.2020, 19:56
[119077]Use notumeric characters to split the string, and find the longest sequence or biggest numberic value (для чисел равной длины) with a ternary operator.
  • Разделитель записей awk ([119508]RS[119509]) также можно установить как любую нецифровую строку:
  • 2
    27.01.2020, 19:56

    bash и сортировка GNU

    IFS=$'\0' read -r l _ < <(tr -cs '[:digit:]' '[\0*]' <<<'11abcde1234556ghijk22'| sort -znr)
    echo $l
    1234556
    
    2
    27.01.2020, 19:56

    На основе ответа @mikeserv есть еще одна альтернатива. Он извлекает числа (по методу mikeserv), затем сортирует их в числовом порядке и берет последнее. Если исключить нули в начале, это даст вам наибольшее число (без учета знака):

    echo 1111askdlfm2234 |  printf %s\\n $(tr -sc 0-9 \ ) | sort -n | tail -1
    
    4
    27.01.2020, 19:56

    Теги

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