2014-11-18 4 views
1

Я довольно новичок в создании сценариев bash, и я пытаюсь сделать массовое обновление данных из больших CSV-файлов.Условная подстановка строк в сценарии bash

Структура файла:

date|id|id|000000|string_type|0|0|0.00|0|0|0|0|0|0|string_subtype. 

Что изменилось, так это string_subtype и иногда string_type.

Когда я только изменить значение string_subtype с:

sed -i 's/string_subtype_old/string_subtype_new/g' $file 

нет никаких проблем.

Проблема при изменении string_type и sub_type в то же время для отдельных строк, то sub_type изменяется для всех записей с тем же string_type

Пример

из

date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeA 
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeA 
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeB 
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeB 
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeC 
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeC 

к

date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeD 
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeD 
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeE 
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeE 
date|id|id|000000|typeB|0|0|0.00|0|0|0|0|0|0|subtypeF 
date|id|id|000000|typeB|0|0|0.00|0|0|0|0|0|0|subtypeF 

Я пробовал с

sed -e 's/string_type_old/string_type_new/g' -e 's/string_subtype_old/string_subtype_new/g' $file 

, но все string_type_old изменены!

Любые предложения?

--edit--

реальный пример:

от

2014-01-01|000fc55|297633835|122350|WHOME|0|0|0.00|2|0|0|0|0|0|WHOME_CLEAN 
2014-01-01|000fc56|297633835|122377|WHOME|0|0|0.00|2|0|0|0|0|0|WHOME_STORA 
2014-01-01|000fc57|297633835|122378|WHOME|0|0|0.00|2|0|0|0|0|0|WHOME_OTHER 
2014-01-01|000fc58|297633835|122428|WHOME|0|0|0.00|2|0|0|0|0|0|WHOME_KGADG 
2014-01-01|000fc59|297633835|120776|WHOME|1|0|0.00|0|0|0|0|0|0|WFOOD_GOURT 

к

2014-01-01|000fc55|297633835|122350|WHOME|0|0|0.00|2|0|0|0|0|0|W_CLEAN 
2014-01-01|000fc56|297633835|122377|WHOME|0|0|0.00|2|0|0|0|0|0|W_STORA 
2014-01-01|000fc57|297633835|122378|WHOME|0|0|0.00|2|0|0|0|0|0|W_OTHER 
2014-01-01|000fc58|297633835|122428|WGADG|0|0|0.00|2|0|0|0|0|0|W_KGADG 
2014-01-01|000fc59|297633835|120776|WFOOD|1|0|0.00|0|0|0|0|0|0|W_GOURT 

Raws 1 до 3 просто с

SED -i «s/WHOME_CLEAN/W_CL EAN/г»$ файла

СЕПГ -i 's/WHOME_STORA/W_STORA/г' $ файла

СЕПГ -i 's/WHOME_OTHER/W_OTHER/г' $ файла

В баранами 4 и 5 Мне нужно изменить главный тип WHOME в WGADG или WFOOD.

с

СЕПГ -e 's/WHOME/WGADG/г' -e 's/WHOME_KGADG/W_KGADG/г' $ файла

все баранами с WHOME меняются!Мне нужно какая-то команда, фильтр, так как Grep, только бараны с типом == WHOME & & подтип == WGADG

+0

Может ли вы дать фактический образец ввода и команды sed, которые вы использовали, что показывает проблему? –

+0

Ваша команда 'sed' показывает' string_type_old' и 'string_subtype_old', которые не находятся в ваших файлах ввода/вывода. – anubhava

ответ

1

вы можете указать изменение подтипа только один раз, как это:

sed '0,/string_subtype_old/s/string_subtype_old/string_subtype_new/' 
Смежные вопросы