Правка файла, bash awk (скорость работы)

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

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

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

Re: Правка файла, bash awk

Сообщение tmp13 »

гммм
ну дык оно так выглядит. оно такое (между прочим) и есть.

проблемма в том что дата должна быть в формате DD.MM.YYYY
1) сначала выделить все даты и разделить их символом \n
2) затем в начале любой строки, которая начинается на /[1-9]\./ дописать нолик сначала.

гммм
3) удалить все \n=)
кстать зная вашу не любовь к awk на нём вроде пока что решил) выглядит конечно не самым лучшим образом но отпадает недобходимость 1, 2 и соотвественно 3 пункта)
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Правка файла, bash awk

Сообщение drBatty »

tmp13 писал(а):
17.12.2009 01:43
кстать зная вашу не любовь к awk на нём вроде пока что решил) выглядит конечно не самым лучшим образом но отпадает недобходимость 1, 2 и соотвественно 3 пункта)

кстати, дайте наконец пару нормальных строчек, и то, что вы хотите из них получить.
тогда этот тред можно будет и закрыть :)

PS: п1. п2. п3 обычно можно реализовать одной командой. возможно - двумя.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

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

Re: Правка файла, bash awk

Сообщение tmp13 »

гммм нормальных в плане реальных или удобочитаемых?)
нормальных в плане реальных:
FFSH|FFFF |1022007|lalalalal | |lalaloa|KLMN |ZZZ|C|BL-M|1|1|1|SUR |31012007|0|2|0|0||R||||0|0|0||||1|SUR ||||0|0|0|0
FFF|FFF983|1022007|tamtam ||lalal|ZZZ |KLMN|S|EU-N|1|1|0|ZUO |31012007|0|4|6,98|85,17|14112007|F|087983|sdffdf|FF123|0|0|0|3|181|14052007|327
03|ZZZ |||1022000|0|0|0|0

вот 2 строчки
нормальных в плане читаемых:
a|lalala|1022009|lalala|FFF|31012007|1022007
a|lalala|1022009|lalala|FFF|31012007|1022007


что я хочу получить:
1) добавить номер строки начиная с N
2) все поля в которых содержится дата(номера полей заранее известны) привести эту дату к виду DD.MM.YYYY
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Правка файла, bash awk

Сообщение drBatty »

tmp13 писал(а):
17.12.2009 17:18
вот 2 строчки
нормальных в плане читаемых:

дайте то что есть, и то, что вы хотите видеть
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

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

Re: Правка файла, bash awk

Сообщение tmp13 »

10|a|lalala|01.02.2009|lalala|FFF|31.01.2007|01.02.2007
11|a|lalala|01.02.2009|lalala|FFF|31.01.2007|01.02.2007


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

Re: Правка файла, bash awk

Сообщение tmp13 »

В продолжение темы...
есть 3 файла
1: sal.csv

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

Vasya|DL|100000|Proger|ZZ
Petya|RUB|20000|Admin|fgg
Misha|EVRO|30000|Yborchica|sdf


2: dol.csv

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

1|Admin|lalaal
2|Proger|pamapamapm
3|Yborchica|okak


3: val.csv

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

1|DL|sdfsdfs
2|RUB|sdfsdf
3|EVRO|asdfsdsf


необходимо первый файл привести к следущему виду(в соответствии с 2 другими) т.е:

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

Vasya|1|100000|2|ZZ
Petya|2|20000|1|fgg
Misha|3|30000|3|sdf


т.е заменить соответствующие поля на идентификаторфы так сказать..
что первое приходит на ум опять этот while read line, awk и т.д..
всё это опять медленно..
помучал тут awk как то грустно выходит.. я чёт стал сомневаться реально ли это такой одной мега командой сделать?

P.S мыли есть реализация хромает))
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Правка файла, bash awk

Сообщение drBatty »

tmp13 писал(а):
25.01.2010 17:52
т.е заменить соответствующие поля на идентификаторфы так сказать..
что первое приходит на ум опять этот while read line, awk и т.д..
всё это опять медленно..
помучал тут awk как то грустно выходит.. я чёт стал сомневаться реально ли это такой одной мега командой сделать?

P.S мыли есть реализация хромает))

ИМХО это лучше делать в БД, например в MySQL, либо писать свою БД, например на C/C++.
файлы с "идентификаторами" большие? если строк 10-100 можно на sed.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

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

Re: Правка файла, bash awk

Сообщение tmp13 »

файлы с "идентификаторами" максимум 2300 строк.
файл который надо править 1-700 мегов (sal.csv)

ИМХО это лучше делать в БД, например в MySQL, либо писать свою БД, например на C/C++.

ну вообще БД Oracle там уже всё это есть, но сложный вопрос где это будет быстрее... если тут не получится я думал в принципе о таком варианте.
(в плане если переделывать это с помощью процедуры.. то на данный момент мысленно она выглядит примерно while read line)

кстать на awk кажется чёт написал выглядит как:

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

awk -F'|' '{number = $1; str = $2; getline < "sal.csv"; if ($2=str) { sub($2, number); } print}' val.csv

смущает правда getline + не проверял на больших файлах + опять пропадают разделители... короче одни минусы=)
т.е. получается:

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

Vasya 10 100000 Proger ZZ
Petya 2 20000 Admin fgg
Misha 4 30000 Yborchica sdf


P.S цифры намерянно менял для теста + до сих пор не понял какой файл в результате моей команды берётся а по какому бежит.. смутное очучение что что-то не так) или вообще я не понимаю как это работает))

Up:
с разделителями решилось:
awk -F'|' '{OFS="|"; number = $1; str = $2; getline < "sal.csv" ; if ($2=str) { sub($2, number) }; print }' val.csv
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Правка файла, bash awk

Сообщение sash-kan »

tmp13 писал(а):
25.01.2010 18:43
где это будет быстрее
подозреваю, что быстрее всего будет работать требуемое в sqlite.
проведите тесты — и можно будет обойтись без подозрений.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Правка файла, bash awk

Сообщение drBatty »

tmp13 писал(а):
25.01.2010 18:43
файлы с "идентификаторами" максимум 2300 строк.

не... хранить такую табличку в sed нереально, а тем более две таких.
tmp13 писал(а):
25.01.2010 18:43
но сложный вопрос где это будет быстрее...

буду очень удивлён, если SQL будет медлееннее.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

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

Re: Правка файла, bash awk

Сообщение tmp13 »

если кому понадобится

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

#!/bin/bash
awk -F'|' '
NR==FNR{a[$2]=$1;next}
a[$2]{OFS="|"; $2=a[$2]; print}' val.txt sal.txt

работает быстро и вроде правильно
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали: