Hi!
Есть два файда, первый 1.txt разделенный символом табуляции
text1 aa1122
text2 00bb22
text3 00eebb
text4 678789
text5 098765
text6 1234cc
text7 aabbccи второй файл 2.txt
text1
text3
text6Надо сравнить эти файлы и в файле 1.txt в совподающих строках с файлом 2.txt заменить
символы а в с на 1 2 3
то есть должно получиться следующее
text1 111122
text2 00bb22
text3 00ee22
text4 678789
text5 098765
text6 123433
text7 aabbccДелаю так
sed -e 's/^/^/' -e 's/$/ /' < /tmp/22.txt | sed 'y/abc/123/' /tmp/11.txtПолучается
text1 111122
text2 002222
text3 00ee22
text4 678789
text5 098765
text6 123433
text7 112233То есть замена происходит во всех строках!
Как добиться правильного вывода?
[c0der@rock ~/openet]$ while read PATTERN; do sed -i "/^$PATTERN/y/abc/123/" 1.txt; done <2.txt
[c0der@rock ~/openet]$ cat 1.txt
text1 111122
text2 00bb22
text3 00ee22
text4 678789
text5 098765
text6 123433
text7 aabbcc
Сенкс за помощь, конечно, в любом случае, а без цикла никак необойтись?Пробовал так
sed -e 's/^/^/' -e 's/$/ /' < /tmp/2.txt | sed 'y/abc/123/' /tmp/1.txt | grep -f - /tmp/1
.txtПолучается
text4 678789
text5 098765Думаю как бы тут с grep извратиться.
>Сенкс за помощь, конечно, в любом случае, а без цикла никак необойтись?sed -i "/^\(`paste 2.txt -d'+' -s | sed 's,+,\\\|,g'`\)/y/abc/123/" 1.txt
Можно ещё вот так. Так даже вроде бы лучше: файл правим один раз, а не вызываем sed для каждой строки + избавились от цикла.
>sed -i "/^\(`paste 2.txt -d'+' -s | sed 's,+,\\\|,g'`\)/y/abc/123/" 1.txtХм.. туплю. У меня не хочет
Вываливает
paste: -d+: No such file or directory
sed: 1: "1.txt": invalid command code .
>>sed -i "/^\(`paste 2.txt -d'+' -s | sed 's,+,\\\|,g'`\)/y/abc/123/" 1.txt
>
>Хм.. туплю. У меня не хочет
>Вываливает
>paste: -d+: No such file or directory
>sed: 1: "1.txt": invalid command code .У меня в zsh работало. Возможно, проблемы в шелле или ещё-чем-нибудь. (помогает подставить echo перед командой и посмотреть, какая команда получится в результате и будет выполнена)
>[оверквотинг удален]
>Пробовал так
>sed -e 's/^/^/' -e 's/$/ /' < /tmp/2.txt | sed 'y/abc/123/' /tmp/1.txt
>| grep -f - /tmp/1
>.txt
>
>Получается
>text4 678789
>text5 098765
>
>Думаю как бы тут с grep извратиться.Вот так тоже можно извратиться:
cat 1.txt | sed "/`cat 2.txt | tr '\n' '|' | sed 's/|$//;s/|/\\\\|/g'`/y/abc/123/"
>>[оверквотинг удален]
>cat 1.txt | sed "/`cat 2.txt | tr '\n' '|' | sed 's/|$//;s/|/\\\\|/g'`/y/abc/123/"cat здесь лишний:
sed "/`cat 2.txt | tr '\n' '|' | sed 's/|$//;s/|/\\\\|/g'`/y/abc/123/" 1.txt
>sed "/`cat 2.txt | tr '\n' '|' | sed 's/|$//;s/|/\\\\|/g'`/y/abc/123/" 1.txtТочно! Это то что нужно!
Всем большое-большое спасибо!!!
М-дя... рано радовался..глянул не проверяя, думал все ОК
sed "/`cat 2.txt | tr '\n' '|' | sed 's/|$//;s/|/\\\\|/g'`/y/abc/123/" 1.txtа оно оказывается не проходит, выводит файл 1.txt без замены символов, в первозданном, так сказать, варианте..
Есть еще какие нибудь варианты?
[...]
>Есть еще какие нибудь варианты?Мой вариант, попробуй подправить :)
>[...]
>>Есть еще какие нибудь варианты?
>
>Мой вариант, попробуй подправить :)Учился в школе, инсте, потом армия, потом жизнь стала казаться сказкой. Живу как в раю после дембеля. Лучше бы косил :)