LINUX.ORG.RU

Замена колонок в тексте


0

2

Приветствую всех!
Еще она (для меня неразрешимая) задачка.
Первый файл:

blabla1 'titimiti1' ohlala1
blabla2 'titimiti2' ohlala2
blabla3 'titimiti3' ohlala3
blabla4 'titimiti4' ohlala4
blabla5 'titimiti5' ohlala5

Второй файл:
tralivali1
tralivali2
tralivali3
tralivali4
tralivali5

Вторую колонку, первого файла находящуюся в одинарных кавычках сменить на колонку из второго файла.
Что бы было вот так:
blabla1 'tralivali1' ohlala1
blabla2 'tralivali2' ohlala2
blabla3 'tralivali3' ohlala3
blabla4 'tralivali4' ohlala4
blabla5 'tralivali5' ohlala5

Помогите решить, please!
p.s. Я далек от программирования, так что, если можно, сразу готовым скриптом.


$ cat 1 2
blabla1 'titimiti1' ohlala1
blabla2 'titimiti2' ohlala2
blabla3 'titimiti3' ohlala3
blabla4 'titimiti4' ohlala4
blabla5 'titimiti5' ohlala5
tralivali1
tralivali2
tralivali3
tralivali4
tralivali5


$ sed 'R2'  1 | sed -r "N;s/(.*)'[^']*'(.*)\n(.*)/\1'\3'\2/"
blabla1 'tralivali1' ohlala1
blabla2 'tralivali2' ohlala2
blabla3 'tralivali3' ohlala3
blabla4 'tralivali4' ohlala4
blabla5 'tralivali5' ohlala5

с вас 150 рублей.

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

Не получается.
Если брать строки а чистом виде, то всё в порядке, но у меня в файле 1 впереди есть строки типа:

#!/bin/bash
export DIR="/media/Downloads/"
export FILE1="$DIR/n3/a"
export OUT="$DIR/OUT"
и получается:
#!/bin/bash
tralivali1
export DIR="/media/Downloads/"
tralivali2
export FILE1="$DIR/n3/a"
tralivali3
export FILE2="$DIR/n3/b"
tralivali4
export OUT="$DIR/OUT"
tralivali5
blabla1 'blabla2 'titimiti2' ohlala2' ohlala1
blabla3 'blabla4 'titimiti4' ohlala4' ohlala3
blabla5 'titimiti5' ohlala5

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

и да:

Если вы думаете, что я вам должен, вы правы: просто положите деньги на этот счёт WM R124353114594, и я вам буду должен. Ну а пока не положили — извините.

emulek
()

делать скрипром

#!/bin/bash array1=( `awk '{print $2 }' file_name` ) #задаем массив со значениями 2 колонки из файла1 array2=( `awk '{ print $2 }' file2` ) #задаем массив со значениями 2 колонки из файла2 n=0 while [ $n -lt `cat file.name | wc -l` ]; do perl -i -pe «s/${array1[$n]}/${array2[$n]}/;» file.name let n++ done как то так должно работать, повнимательнее с` и ' пробелы и прочие знаки, писал быстро, не проверял. Должно в цикле менять значения. Разберитесь с номерами массивов, где что менять. Да прибудет с вами сила

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

Уважаемый emulek! Будьте любезны, покажите мне место, где я от Вас чего-то требую. За помощь - отдельное Спасибо, и не более!

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

Не годится. tilitili и tralivali - это от фонаря. Просто там находится чего угодно

serles
() автор топика
#!/usr/bin/env perl
open FILE1, "file1.txt";
open FILE2, "file2.txt";

@file = <FILE1>;
close FILE1;
@column = <FILE2>;
close FILE2;
open FILE_WRITE, ">file1.txt";
chomp (@column);

for $sm (@file) {
	for (@column) {
		$sm =~ s/(?<=\').*(?=\')/\Q$_/g
	}
}
print FILE_WRITE @file

file1.txt и file2.txt заменишь на свои имена файлов.

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

Большое спасибо, но опять не то:
file1:

#!/bin/bash
export DIR="/media/Downloads/"
export FILE1="$DIR/n3/a"
export OUT="$DIR/OUT"
blabla1 'titimiti1' ohlala1
blabla2 'titimiti2' ohlala2
blabla3 'titimiti3' ohlala3
blabla4 'titimiti4' ohlala4
blabla5 'titimiti5' ohlala5

file2:[br]
tralivali1
tralivali2
tralivali3
tralivali4
tralivali5

выхлоп:

#!/bin/bash
export DIR="/media/Downloads/"
export FILE1="$DIR/n3/a"
export OUT="$DIR/OUT"
blabla1 'tralivali5' ohlala1
blabla2 'tralivali5' ohlala2
blabla3 'tralivali5' ohlala3
blabla4 'tralivali5' ohlala4
blabla5 'tralivali5' ohlala5

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

Спасибо за участие, но опять пролёт:
выхлоп:

#!/bin/bash'tralivali1'#!/bin/bash
export DIR="/media/Downloads/"'tralivali2'export DIR="/media/Downloads/"
export FILE1="$DIR/n3/a"'tralivali3'export FILE1="$DIR/n3/a"
export OUT="$DIR/OUT"'tralivali4'export OUT="$DIR/OUT"
blabla1 'tralivali5' ohlala1
blabla2 '' ohlala2
blabla3 '' ohlala3
blabla4 '' ohlala4
blabla5 '' ohlala5

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

Уважаемый emulek! Будьте любезны, покажите мне место, где я от Вас чего-то требую. За помощь - отдельное Спасибо, и не более!

я домашние задания бесплатно делаю только за своих сыновей. Но и их я _заставляю_ делать самостоятельно.

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

Спасибо, так работает, но хотелось бы попробовать другими средствами.
Поршу прощения, я наверное не совсем правильно сформулировал задачу.
Расширю:
file1:

#!/bin/bash
export DIR="/media/Downloads/"
export FILE1="$DIR/n3/a"
export OUT="$DIR/OUT"
blabla1 'titimiti1' ohlala1
blabla2 'titimiti2' ohlala2
blabla3 'titimiti3' ohlala3
blabla4 'titimiti4' ohlala4
blabla5 'titimiti5' ohlala5
...... #еще
...... #несколько
...... #строк
blabla1 'titimiti1' tratata1
blabla2 'titimiti2' tratata2
blabla3 'titimiti3' tratata3
blabla4 'titimiti4' tratata4
blabla5 'titimiti5' tratata5
...... #следующие
...... #новые
...... #строки
Строки, в которых прозводится замена, в файле расположены поблочно (здесь их 2, может быть и больше).
Блоки почти иденичны, т.е отличие только в третьей колонке.
В файле 2 строк столько же, сколько в каждом блоке.

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

Это не домашнее задание
См. выше

Я далек от программирования

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

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

епрст

Если брать строки а чистом виде, то всё в порядке, но у меня в файле 1 впереди есть строки типа:

Вам пишут абстрактное решение для абстрактной вашей задачи. Напишите уж конкретные данные (а не выдуманные) для задачи, чтобы увидеть пути её решения.

justAmoment ★★★★★
()
Ответ на: епрст от justAmoment

Хм...
Переставить конкретные столбцы местами в конкретных шаблонах - неконкретно...

Однако всё равно, спасибо за ответ!
Благодаря наводке kvap и sed'у задачу решил!
Всем большое спасибо!

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

ну дык исправьте ошибку в моём скрипте, раз вы «соображаете». Я же не знал, какие у вас данные.

Вот так работает:

$ sed "/'.*'/R2"  1 | sed -r "N;s/(.*)'[^']*'(.*)\n(.*)/\1'\3'\2/"
#!/bin/bash
export DIR="/media/Downloads/"
export FILE1="$DIR/n3/a"
export OUT="$DIR/OUT"
blabla1 'tralivali1' ohlala1
blabla2 'tralivali2' ohlala2
blabla3 'tralivali3' ohlala3
blabla4 'tralivali4' ohlala4
blabla5 'tralivali5' ohlala5
...... #еще
...... #несколько
...... #строк

emulek
()

лолкс

верните

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

Прошу прощения, Вы неверно меня поняли.
Я имел ввиду:
Ваша помощь избавит меня от рутины, которую я выполняю при решении неких (никоим образом не связанных с программированием) задач, в которых я немножечко соображаю.
За участие и оказанную чайнику помощь - огромное Спасибо!

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

Hint: разберитесь как работает моя строчка, и свои задачки вы сможете решать самостоятельно. Тут нет никакой магии, если что непонятно — спрашивайте.

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

R filename это чтение одной строки из файла filename. Второй вариант скрипта читает не каждый раз, а только если в строке первого файла есть 'кавычки'(т.е. если там нужно менять слово в кавычках на слово из второго файла).

Команда N читает из файла след. строку, при этом текущая строка не удаляется, а остаётся в буфере. У нас эта вторая строка — слово для замены.

Кстати, в моём скрипте ошибка, он неправильно работает, если в начале есть нечётное количество строк, в которых менять ничего не нужно. Это можно исправить, но мне лень, т.к. fix очевиден.

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

Спасибо, сейчас поразбираюсь и отпишусь

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