2016-06-02 2 views
2

Я пытаюсь найти самую длинную последовательность цифр из строки в bash, используя только awk. Я сформировал следующую команду, и она дает мне результат.Поиск самой длинной последовательности цифр из строки в bash с использованием только awk

$ echo "This_is_1234_and_44448888_1234567_111111_23456789_and_234" | sed 's/./\n&/g' | awk 'BEGIN{max_length=0} { tmp=match($1,/[0-9]/) ; if (tmp) { numbers[i]=numbers[i]$0;non_digit=0;} else if (non_digit<1) { non_digit=2 ;i++; } } END { i=0; for (key in numbers) { current_length=length(numbers[key]); if (current_length > max_length) { max_length = current_length; i = 0;} if (current_length >= max_length) {i++; max_length_strings[i] = numbers[key];} } print "max_length for the consecutive number portion is ",max_length; for (j in max_length_strings) { print "String_Part: " max_length_strings[j] " and Length: " max_length; }}' 
max_length for the consecutive number portion is 8 
String_Part: 23456789 and Length: 8 
String_Part: 44448888 and Length: 8 

Но для получения каждого символа из строки для проверки цифр, я использую sed команду.

Так как я могу избежать этого использования sed и добиться того же результата, используя одну команду awk?

ответ

1

Использование только AWK:

s="This_is_1234_and_44448888_1234567_111111_23456789_and_234" 

awk -v RS='[^[:digit:]]+' 'length($0) >= max{ 
    max=length($0) 
    num[max]=(num[max]?num[max] "," $0:$0) 
} 
END { 
    printf "max length=%s, numbers: %s\n", max, num[max] 
}' <<< "$s" 

max length=8, numbers: 44448888,23456789 

Пояснение:

  • Использование пользовательских RS='[^[:digit:]]+' мы делаем разделитель, как 1 или более не цифровых символов, при этом каждая запись становится значные поля
  • Затем мы проверяем длину каждой записи (все цифровые поля) и продолжаем обновлять переменную max в length($0) >= max блок
  • Мы также сохранить все максимальные поля длины в num массиве
  • В END блоке мы просто напечатать max и num массив начального
  • Это gnu-awk специфический вследствие многолучевого характера RS
+0

могли бы вы объяснить немного, как код работает с RS –

+0

Добавлено объяснение в ответ. – anubhava

+1

Вы должны упомянуть о специфике gawk из-за многосимвольного RS. –

0

С GNU AWK 4. * для FPAT и истинных многомерных массивов:

$ cat tst.awk 
BEGIN { FPAT="[0-9]+" } 
{ 
    delete strs 
    for (i=1;i<=NF;i++) { 
     cur = length($i) 
     strs[cur][$i] 
     max = (i>1 && cur>max ? cur : max) 
    } 
    for (str in strs[max]) { 
     printf "String_Part: %s and Length: %d\n", str, max 
    } 
} 

$ awk -f tst.awk file 
String_Part: 23456789 and Length: 8 
String_Part: 44448888 and Length: 8 

Вышеупомянутое предполагает, что вы хотите выход max для каждой строки ввода, а не для всего файла. Если вы хотите его через весь файл, то, опять-таки с GNU AWK (для RT):

$ cat tst.awk 
BEGIN { RS="[0-9]+" } 
{ 
    cur = length(RT) 
    strs[cur][RT] 
    max = (NR>1 && cur>max ? cur : max) 
} 
END { 
    for (str in strs[max]) { 
     printf "String_Part: %s and Length: %d\n", str, max 
    } 
} 

$ awk -f tst.awk file 
String_Part: 23456789 and Length: 8 
String_Part: 44448888 and Length: 8 
Смежные вопросы