LINUX.ORG.RU

Выборочная замена строк в sed

 , , ,


0

1

Всем доброе время суток. Появилась проблема в некоторой задаче. Суть задачи вот в чем. Есть два текстовых файла. Необходимо содержимым первого файла построчно заменить содержимое второго, но параметрами указать какие именно строки оставить нетронутыми во втором файле. Количество параметров может быть произвольное. Нужно написать скрипт на bash, который будет поддерживать такую функциональность при любом количестве параметров. Подскажите пожалуйста, в какую сторону лучше копать, может быть лучше смотреть в сторону awk или perl ибо через sed не могу получить нужный результат или что-то не так делаю? Заранее спасибо.


Загони оба файла в СУБД и не пудри мозги. Всё решаецо запросом

update file2
set [поля для замены]
from [список из двух файлов, преобразованных в таблицы]
on file2 left join file1 on ([параметр])

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

Дело в том, что количество файлов динамически меняется и нет условия для хранения этих файлов в БД

.

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

нет условия для хранения этих файлов в БД

Ты пришёл за советом или как? Можно отслеживать появление новых файлов и писать это событие в БД. А на основе БД принимать решение. В противном случае тебе придётся содержать мильон потоков.

ziemin ★★
()

man awk в районе getline

anonymous
()

в чем именно проблема? это вообще стандартная программерская задача - взять файл (два, три, ... n) и сформировать на его (их) основе набор данных, который можно скинуть опять же в файл. решается как обычно - берёшь любой язык программирования, который знаешь, и программируешь. если что-то не получается задаешь _конкретный_ вопрос. лично я бы воял сие на перле.

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

Может в том, что именно sed-ом пытаются решить.

anonymous
()

Количество параметров может быть произвольное.

WHAAAT???

Ну давай, я за тебя придумаю, что такое параметры. Пусть, это будет map.txt, в котором построчно указано откуда брать нужную строку.

$cat map.txt
1
2
1
1
2

Исходные файлы.
$ cat 1.txt
a1
a2
a3
a4
a5
$ cat 2.txt
b1
b2
b3
b4
b5
b6
Программа
$ cat 1x2.sh
#!/bin/sh
for i in $(seq 1 $(wc -l map.txt | awk '{print $1}'));
 do sed -n $i'p' $(sed -n $i'p' map.txt).txt >> out.txt;
done;
Результат
$ cat out.txt
a1
b2
a3
a4
b5

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

Какая гадость, wc -l < file же.

Согласен. Так поэстетичнее будет.

$ cat 1x2.sh
#!/bin/sh
for i in $(seq 1 $(wc -l < map.txt));
 do sed -n $i'p' $(sed -n $i'p' map.txt).txt >> out.txt;
done;

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

Решение

Все-таки нашел решение

#!/bin/bash

in_lenght=«param1;param2»

arr=$(echo $in_lenght | tr ";" «\n»)

temp=«» while read line

do

for x in $arr

do

search=$(grep «${x}» File2) echo «$line» | grep «${x}» && temp=$search || temp=$line

[[ «$temp» == «$search» ]] && break done

echo «${temp}» >>FileResult

done <«File1»

Все-таки обошелся без sed, всем спасибо за помощь и советы

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

условие неполное. Если в первом файле есть строка которая нетронута, то надо-ли во втором пропускать строку? Если нет, то:

$ cat f1 f2
A1
A2
A3
A4
B1
B2
B3
B4
$ sed -n '/A2/{p;b};R f2' f1
B1
A2
B2
B3

тут сохраняется строка «A2».

emulek
()
Ответ на: Решение от kart

Все-таки обошелся без sed

молодец.

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

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