Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: задачка на awk  (Прочитано 773 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ReNzRv

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
задачка на awk
« : 01 Августа 2016, 23:56:27 »
В строках содержащих после пробелов в начале число больше 24 - отнять 24 и записать новое значение.
Это кажется элементарно, но сложности вот в чем: Количество пробелов в начале может быть произвольным, и после записи нового значения в строку должно остатся неизменным.
Cтрока с отнимаемым числом может быть только такого вида: ^\s*[2-9][0-9]:[0-9][0-9].*

Тест:
Имя Текст
25 Имя Текст 2
     23:12 Имя Текст 3
       01:41 Имя Текст 4
         27:59 Имя Текст 5
           25:33 Имя Текст 6
должно получатся так:
Имя Текст
25 Имя Текст 2
     23:12 Имя Текст 3
       01:41 Имя Текст 4
         3:59 Имя Текст 5
          1:33 Имя Текст 6

Вариант для строк без пробелов есть и работает, а вот с пробелами никак, пытался так:
awk -F: -v OFS=: '$1~/^ *[2-9][0-9]:[0-9][0-9].*/ && $1 >= 24 {$1=$1 - 24};{print}'
Спасибо)
« Последнее редактирование: 02 Августа 2016, 00:03:59 от renzrv »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: задачка на awk
« Ответ #1 : 02 Августа 2016, 13:39:10 »
Самое простое добавить символ и его убрать
Код: (bash) [Выделить]
sed 's/^\s\+/&:/' | awk -F: '$2>24{$2-=24}1' OFS=: | sed '/^\s*:/s/://'
Пользователь добавил сообщение 02 Августа 2016, 14:41:04:
Но это не наши методы
Код: (bash) [Выделить]
awk '
    BEGIN{
        FS=OFS=""
    }
    !/^ +[0-9]+:/{
        print
        next
    }
    {
        i=0
        while($(++i) == " ")
            printf $i
        num=""
        while($(i) ~ "[0-9]")
            num = num $(i++)
        if(num > 24)
            printf num - 24
        else
            printf num
        for(j=i;j<=NF;j++)
            printf $j
        print ""
    }
    '

Пользователь добавил сообщение 02 Августа 2016, 15:31:16:
Ну или чуть проще
Код: (bash) [Выделить]
awk -F: '/^ +[0-9]+:/ && $1 + 0 > 24{sub("[0-9]+", $1 - 24)}1'
« Последнее редактирование: 02 Августа 2016, 15:31:16 от Azure »
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: задачка на awk
« Ответ #2 : 05 Августа 2016, 22:58:43 »
первое, второе - да, не наш метод, не то, но второе интересно, а последнее оно, что надо, спс.
« Последнее редактирование: 05 Августа 2016, 23:20:51 от renzrv »

 

Страница сгенерирована за 0.027 секунд. Запросов: 21.