awk. Замена поля

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Termitnik
сержант
Сообщения: 169
Зарегистрирован: 2008-04-05 20:09:45
Откуда: Киев

awk. Замена поля

Непрочитанное сообщение Termitnik » 2008-09-12 14:25:30

Здравствуйте!
Необходимо в файле file в строке содержащей вхождение free заменить второе поле. Пишу:
awk "/free/ {sub(/$2/,\"some text\");print}" file
Но some text добавляется в начало строки, втрое поле остается. :(
Как правильно?

Гость
проходил мимо

Re: awk. Замена поля

Непрочитанное сообщение Гость » 2008-09-12 14:53:24

Termitnik писал(а):awk "/free/ {sub(/$2/,\"some text\");print}" file

заменить foo на bar в втором поле - sub("foo", "bar", $2)

zg
полковник
Сообщения: 5841
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: awk. Замена поля

Непрочитанное сообщение zg » 2008-09-12 15:10:16

образец дай, чего есть, чего надо, а там видно будет, чего и как заменять

Termitnik
сержант
Сообщения: 169
Зарегистрирован: 2008-04-05 20:09:45
Откуда: Киев

Re: awk. Замена поля

Непрочитанное сообщение Termitnik » 2008-09-12 15:19:11

Гость писал(а):
Termitnik писал(а):awk "/free/ {sub(/$2/,\"some text\");print}" file

заменить foo на bar в втором поле - sub("foo", "bar", $2)

Содержимое втрого поля может варьироваться, мне нужно заменить его целиком.
zg писал(а):образец дай, чего есть, чего надо, а там видно будет, чего и как заменять

Есть:
vlan31 ХХХ.ХХХ.ХХХ.ХХХ/ХХ free
Надо:
vlan31 YYY.YYY.YYY.YYY/YY free


zg
полковник
Сообщения: 5841
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: awk. Замена поля

Непрочитанное сообщение zg » 2008-09-12 15:28:08

Код: Выделить всё

zg# awk '{if ($1=="vlan31") $2="YYY.YYY.YYY.YYY/YY"; print}' 1.txt
vlan31 YYY.YYY.YYY.YYY/YY free
inet XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX
zg# cat 1.txt
vlan31 ХХХ.ХХХ.ХХХ.ХХХ/ХХ free
inet XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX
zg#


UPD: прочитал первый пост

Код: Выделить всё

zg# awk '{if (match($0, "free")) $2="YYY.YYY.YYY.YYY/YY"; print}' 1.txt
vlan31 YYY.YYY.YYY.YYY/YY free
inet XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX
zg#

Termitnik
сержант
Сообщения: 169
Зарегистрирован: 2008-04-05 20:09:45
Откуда: Киев

Re: awk. Замена поля

Непрочитанное сообщение Termitnik » 2008-09-12 15:58:22

Спасибо!

zrad
проходил мимо
Сообщения: 2
Зарегистрирован: 2009-04-13 16:24:37

Re: awk. Замена поля

Непрочитанное сообщение zrad » 2009-04-13 16:51:23

Всем привет.
Есть аналогичная задача, пытаюсь применить приведенный здесь скрипт, но не срабатывает.
Есть много файлов с именами в формате ГГММДДЧЧ.* примерно такого формата:

Код: Выделить всё

030209 1156 00011 9    9  717             8962XXXXABCD             702  05  35  702             702               4 0 2
030209 1156 00025 9                               333                      06  702             702               0 0 2
030209 1156 00019 7    9  714                 ZZZZZZZ             333  11                      333               4 0 1
030209 1156 00038 9    9  717             8926XXXXXXXX         ZZZZZZZ  26  15  714         ZZZZZZZ               4 0 2

Необходимо прямо внутри этих файлов, в строчках содержащих 8962XXXXABCD произвести замену значений в колонках №8 и №12 (считая с единицы).

Скрипт выглядит таким образом:

Код: Выделить всё

awk '{match($7, "8962XXXXABCD") $8="030"; print}' 0903*
awk '{match($7, "8962XXXXABCD") $12="030"; print}' 0903*

Но после запуска скрипта никаких изменений в файлах не наблюдается.
Так тоже пробовал, с таким же результатом:

Код: Выделить всё

awk '{if ($7=="8962XXXXABCD") $8="030"; print}' 0903*
awk '{if ($7=="8962XXXXABCD") $12="030"; print}' 0903*


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

zg
полковник
Сообщения: 5841
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: awk. Замена поля

Непрочитанное сообщение zg » 2009-04-13 17:12:56

zrad писал(а):Но после запуска скрипта никаких изменений в файлах не наблюдается.
-))) и не будет, пока вывод не завернёшь куда надо

zrad
проходил мимо
Сообщения: 2
Зарегистрирован: 2009-04-13 16:24:37

Re: awk. Замена поля

Непрочитанное сообщение zrad » 2009-04-13 18:06:16

Упс...
А есть способ сделать так, чтобы изменения происходили во входных файлах? Ну или чтобы на выходе сгенерировались копии этих файлов с идентичными именами и полным содержимым с отличием только в точках замен?

zg
полковник
Сообщения: 5841
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: awk. Замена поля

Непрочитанное сообщение zg » 2009-04-13 18:29:14

zrad писал(а):А есть способ сделать так, чтобы изменения происходили во входных файлах?
через временные файлы

Код: Выделить всё

cat some.file | обработка > tmp.file
mv tmp.file some.file

Demis
мл. сержант
Сообщения: 94
Зарегистрирован: 2015-05-25 14:36:32

awk. Замена поля

Непрочитанное сообщение Demis » 2017-07-27 12:39:28

Просто добавлю пример другой обработки, чтобы не забыть самому.
Не факт, что это нельзя было сделать короче.
Уперся я в сортировку с датами в ком. строке шелла csh.
Есть, допустим, два файла, первый: cat file3

Код: Выделить всё

Apr  01 00:00:00 [чего-то там 1]
Apr  9 08:50:48 [чего-то там 8]
Apr  8 09:20:37 [чего-то там 3]
Apr  8 22:22:40 [чего-то там 4]
Apr  22 22:26:41 [чего-то там 225]
Apr  18 22:26:41 [чего-то там 25]
Apr  8 22:26:41 [чего-то там 5]
Apr  8 22:27:56 [чего-то там 6]
Apr  8 23:27:27 [чего-то там 7]
Apr  3 08:59:28 [чего-то там 2]
второй cat file4

Код: Выделить всё

08-Apr-2017 22:21:51 [чего-то там 10]
08-Apr-2017 22:27:57 [чего-то там 16]
08-Apr-2017 22:23:53 [чего-то там 12]
08-Apr-2017 22:24:54 [чего-то там 13]
18-Apr-2017 22:24:56 [чего-то там 2213]
18-Apr-2017 22:24:54 [чего-то там 213]
19-Apr-2017 22:24:54 [чего-то там 213]
08-Apr-2017 22:25:55 [чего-то там 14]
08-Apr-2017 22:26:56 [чего-то там 15]
08-Apr-2017 22:22:52 [чего-то там 11]

На выходе хочу получить все отсортированное по дате.
Вариант cat file3 file4|sort -g дает нам:

Код: Выделить всё

Apr  01 00:00:00 [чего-то там 1]
Apr  18 22:26:41 [чего-то там 25]
Apr  22 22:26:41 [чего-то там 225]
Apr  3 08:59:28 [чего-то там 2]
Apr  8 09:20:37 [чего-то там 3]
Apr  8 22:22:40 [чего-то там 4]
Apr  8 22:26:41 [чего-то там 5]
Apr  8 22:27:56 [чего-то там 6]
Apr  8 23:27:27 [чего-то там 7]
Apr  9 08:50:48 [чего-то там 8]
08-Apr-2017 22:21:51 [чего-то там 10]
08-Apr-2017 22:22:52 [чего-то там 11]
08-Apr-2017 22:23:53 [чего-то там 12]
08-Apr-2017 22:24:54 [чего-то там 13]
08-Apr-2017 22:25:55 [чего-то там 14]
08-Apr-2017 22:26:56 [чего-то там 15]
08-Apr-2017 22:27:57 [чего-то там 16]
18-Apr-2017 22:24:54 [чего-то там 213]
18-Apr-2017 22:24:56 [чего-то там 2213]
19-Apr-2017 22:24:54 [чего-то там 213]
т.е. совсем не то, что хочется. Хотя скажем cat file3 file4 | sort +1 -g дает:

Код: Выделить всё

Apr  01 00:00:00 [чего-то там 1]
Apr  3 08:59:28 [чего-то там 2]
Apr  8 09:20:37 [чего-то там 3]
Apr  8 22:22:40 [чего-то там 4]
Apr  8 22:26:41 [чего-то там 5]
Apr  8 22:27:56 [чего-то там 6]
Apr  8 23:27:27 [чего-то там 7]
Apr  9 08:50:48 [чего-то там 8]
Apr  18 22:26:41 [чего-то там 25]
08-Apr-2017 22:21:51 [чего-то там 10]
08-Apr-2017 22:22:52 [чего-то там 11]
08-Apr-2017 22:23:53 [чего-то там 12]
08-Apr-2017 22:24:54 [чего-то там 13]
08-Apr-2017 22:25:55 [чего-то там 14]
08-Apr-2017 22:26:56 [чего-то там 15]
08-Apr-2017 22:27:57 [чего-то там 16]
18-Apr-2017 22:24:54 [чего-то там 213]
18-Apr-2017 22:24:56 [чего-то там 2213]
19-Apr-2017 22:24:54 [чего-то там 213]
Apr  22 22:26:41 [чего-то там 225]
т.е. видно, что по второму полю сортировка работает, а по первому нет.
Решение нашел такое (в одну строку):

Код: Выделить всё

# ( ( cat file3 | awk '{ print $2 "-" $1 "-2017 " $3 " - " $0}' | sort ) && ( cat file4 | sort ) ) | awk '{first=substr($0,1,1);gsub("0","",first);end=substr($0,2);print first end}' | sort -g
На выходе получаем вроде то, что надо:

Код: Выделить всё

1-Apr-2017 00:00:00 - Apr  01 00:00:00 [чего-то там 1]
3-Apr-2017 08:59:28 - Apr  3 08:59:28 [чего-то там 2]
8-Apr-2017 09:20:37 - Apr  8 09:20:37 [чего-то там 3]
8-Apr-2017 22:21:51 [чего-то там 10]
8-Apr-2017 22:22:40 - Apr  8 22:22:40 [чего-то там 4]
8-Apr-2017 22:22:52 [чего-то там 11]
8-Apr-2017 22:23:53 [чего-то там 12]
8-Apr-2017 22:24:54 [чего-то там 13]
8-Apr-2017 22:25:55 [чего-то там 14]
8-Apr-2017 22:26:41 - Apr  8 22:26:41 [чего-то там 5]
8-Apr-2017 22:26:56 [чего-то там 15]
8-Apr-2017 22:27:56 - Apr  8 22:27:56 [чего-то там 6]
8-Apr-2017 22:27:57 [чего-то там 16]
8-Apr-2017 23:27:27 - Apr  8 23:27:27 [чего-то там 7]
9-Apr-2017 08:50:48 - Apr  9 08:50:48 [чего-то там 8]
18-Apr-2017 22:24:54 [чего-то там 213]
18-Apr-2017 22:24:56 [чего-то там 2213]
18-Apr-2017 22:26:41 - Apr  18 22:26:41 [чего-то там 25]
19-Apr-2017 22:24:54 [чего-то там 213]
22-Apr-2017 22:26:41 - Apr  22 22:26:41 [чего-то там 225]
Конечно не все красиво и нужно следить за годом, но уже полегче.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34860
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

awk. Замена поля

Непрочитанное сообщение Alex Keda » 2017-08-12 22:44:37

таки год в начало, месяц, потом дату
тока месяц должен быть числовой
и сортировать по человечески ...
Убей их всех! Бог потом рассортирует...


Вернуться в «SHELL»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя