LINUX.ORG.RU

bash sed awk Заменить подстроку на найденное значение из другого файла

 ,


0

1

Здравствуйте, товарищи. Столкнулся с проблемой, которую никак не могу понять, как решать. Есть файл с большим набором строк вида: {20190620150637,N, {0,0},48,26,5,19865,2937,W,«Значения до изменения: Склад: Ск0120 ДатаФиксации: 01.01.2018 0:00:00 Установленные значения: »,0, {«R»,65:8106005056a95b8211e8947b9c4dea27},«Маффины OPS! 300г с нач.Вареная сгущенка»,1,6,6,2184867,0, {0} }, ...

Файл инструкций содержит строки вида: {4,«Данные.Проведение»,2937}, {1,4c1c4d12-61b2-4576-a860-04e815678417,«Обмен»,48}, ...

Мне нужно, чтобы при парсинге этого файла я смог значение из исходного файла заменить на значение файла-инструкций. Например, 48 в исходной строке заменить на Данные.Проведение, 2937 заменить на Обмен

Что я делаю: Скриптом нормализую исходный файл к строке выше, осуществляю поиск необходимого параметра и кладу в промежуточный файл 1.txt для примера for file in ./*.lgp; do echo $file; cat $file | sed -e 's/\n/" «/g' -e 's/{[0-9]\{14\}/\n&/g'|grep „2940,W“|grep „К006“ >> 1.txt ; done;

Потом начинаю парсить промежуточный файл с помощью awk cat 1.txt|awk -F',' '{print $4}' а дальше ни в какую не могу понять, как мне связать $4 и строку скрипт cat 1cv8.lgf| grep »{1,«| sed -e 's/{1,//' -e „s/},//“ -e 's/\»//g'|awk -F',' '{print $2}'

Прошу не кидать тапками я только начал постигать баш скрипты для анализа больших данных

Начни с использования lorcode или markdown.

Yorween
()
Последнее исправление: Yorween (всего исправлений: 1)

я только начал постигать баш скрипты

Начни с /bin/sh, /bin/bash подождёт. :)

Deleted
()
Ответ на: комментарий от Deleted

Или /usr/bin/python.

Серьезно, зачем городить этот криптоужас, если задача решается проще на ЯП общего назначения.

goingUp ★★★★★
()
Ответ на: комментарий от Deleted

Как называется эта болезнь, когда тянет к нечитаемому >><@%P}{^&#* ?

anonymous
()
Ответ на: комментарий от goingUp

Но ведь перл может быть даже похуже

В данном случае не может, потому что делался именно для таких задач, а питон - для ОП.

Deleted
()
Ответ на: комментарий от Deleted

Может в любом случае, тк пишущего ничего не останавливает, а только поощряет наличием вагона эзотерики искаробки.

anonymous
()
Ответ на: комментарий от Deleted

Может и делался, но не всегда получается то, что задумывалось. И судя по TOOWTDI питон задумывался, чтобы как раз поправить то, что перл свернул в какие-то пучины безумия как у лавкрафта, где вместо нормальных скриптов получается что-то хтоническое.

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

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от goingUp

питон задумывался, чтобы как раз поправить

Девелопмерам питона это расскажи.

Взял бы он питон

Из пушки по воробьям.

Deleted
()
Ответ на: комментарий от Deleted

Из пушки по воробьям.

Поговорочки из методички? Уровень бабок у подъезда.

anonymous
()

Если сможешь разобрать исходные данные в плоский файл-таблицу, то всё можно легко провернуть одним скриптом на awk. В секции BEGIN считать файл инструкций в ассоциативный массив, а дальше уже читать файл как обычно читать файл и заменять $4 или что там на то, что надо.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Можно поподробнее, как это сделать? Или в идеале даже пример или ссылку, где можно подробнее почитать? Я просто только начал писать скрипты, поэтому еще не совсем могу понять что к чему

buganych
() автор топика
Ответ на: комментарий от goingUp

потому что для этой и многих других задач гораздо проще набросать скриптов, чем изучать питон и иже с ним

buganych
() автор топика

никак не могу понять, как решать

sqlite

anonymous
()
Ответ на: комментарий от buganych

Ну первое, что нашлось - по такому принципу настроить обработку по такому принципу https://stackoverflow.com/questions/18600278/replacement-by-dictionary-possible-with-awk-or-sed но только в секции BEGIN { } не заполнять ассоциативный массив вручную, а считать из файла через while(getline < "файл") {map[$1]=$2;} (примерный код).

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Спасибо большое за подсказку! Все получилось!

buganych
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.