awk replace (sub)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

awk replace

Сообщение tmp13 »

файл test.txt

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

12345|lalalal|vot tak|02032009|a|1032009
12345|lalalal|vot tak|03042009|a|1042009
12345|lalalal|vot tak|04052009|a|1052009
12345|lalalal|vot tak|05062009|a|1062009
12345|lalalal|vot tak|06072009|a|1072009

задача в 6 столбце добавить 0 в начало...

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

awk -F'|' '{ if (length($6)!=8) { sub($6,"0"$6,$6) }; sub($6,substr($6, 0, 2)"."substr($6, 3, 2)"."substr($6, 5, 4)); print }' test.txt

результат:

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

2345 lalalal vot tak 02032009 a 01.03.2009
12345 lalalal vot tak 03042009 a 01.04.2009
12345 lalalal vot tak 04052009 a 01.05.2009
12345 lalalal vot tak 05062009 a 01.06.2009
12345 lalalal vot tak 06072009 a 01.07.2009

куда то улетают все разделители(( что я делаю не так?
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: awk replace

Сообщение allez »

Разделители никуда не улетают. Просто awk не включает их в значения полей и это логично, не так ли? ;)
Поэтому, если вам нужны разделители в результатах работы awk, то придется явно указывать их в операторах вывода.
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: awk replace

Сообщение tmp13 »

э-э... об этом я тоже думал)
вообще проблемму решил так:
awk -F'|' '{ if (length($6)!=8) { sub($6,'0'$6) }; sub($6,substr($6, 0, 2)"."substr($6, 3, 2)"."substr($6, 5, 4)); print }' test.txt

решил правда методом тыка т.е. в sub где if
поменял

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

sub($6,"0"$6,$6)
на

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

sub($6,'0'$6)

и всё заработало... как не знаю)) ура!
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: awk replace

Сообщение tmp13 »

в продолжение темы... предположим файл выглядит
12345|lalalal|vot tak|02032009|a|1032009
12345|lalalal|vot tak|03042009|a|
12345|lalalal|vot tak|04052009|a|1052009
12345|lalalal|vot tak|05062009|a|1062009
12345|lalalal|vot tak|06072009|a|1072009

вот так
в результате выполнения
awk -F'|' '{ if (length($6)!=8) { sub($6,'0'$6) }; sub($6,substr($6, 0, 2)"."substr($6, 3, 2)"."substr($6, 5, 4)); print }' test.txt

получаем
12345|lalalal|vot tak|02032009|a|01.03.2009
..012345|lalalal|vot tak|03042009|a|
12345|lalalal|vot tak|04052009|a|01.05.2009
12345|lalalal|vot tak|05062009|a|01.06.2009
12345|lalalal|vot tak|06072009|a|01.07.2009

совершенно не понятно каким макаром точки ушли в 1 столбец??
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: awk replace

Сообщение t.t »

Дата всегда в конце строки? Если так, то зачем упражняться со столбцами?

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

sed -r 's/([0-3][0-9])([0-1][0-9])([1-2][0-9]{3})$/\1.\2.\3/'
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: awk replace

Сообщение tmp13 »

нет дата где угодно...
переписал:

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

awk -F'|' '{ if (length($4)!=0) { if (length($4)!=8) { sub($4, '0'$4)}; sub($4,substr($4, 0, 2)"."substr($4, 3, 2)"."substr($4, 5, 4))}; print }' test.txt

вообщем данная проблемма с awk решена)
спасибо всем=)
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: awk replace

Сообщение tmp13 »

Поэтому, если вам нужны разделители в результатах работы awk, то придется явно указывать их в операторах вывода.

гммм и как их туда добавить?

Решено:
параметр OFS добавляет в вывод нужный разделитель.
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: awk replace

Сообщение smaharbA »

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

awk -F'|' '{for (i=1;i<NF;i++) printf $i"|";printf "%08d\n", $NF | "cut -c 1-2,3-4,5-  --output-delimiter=." }' ...
Я конечно далек от мысли...(с)
Спасибо сказали: