удалить из одного файла те строки которые есть в другом (bash)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Dr.SMP
Сообщения: 233
ОС: Agilia & Frugalware

удалить из одного файла те строки которые есть в другом

Сообщение Dr.SMP »

удалить из file1 те строки которые есть в file2
строка = 1 слово
Вот все что напридумывал (с фантазией сегодня у меня слабо):

file1="~/file1.txt"
file2="~/file2.txt"

for i in $(cat $ylst)
do
$tmp=$(sed "/$i/d" $plst)
echo $tmp > $plst
done

и нифига...

Сам скрипт создает 2 списка (archlinux), yaourt only package & pacman package
PP - содержит список всех пакетов в системе
YP - только список пакетов из AUR

нужно чтоб в PP не было пакетов из YP.

помогите пожалуйста.
Не спеши, а то успеешь, следствие - тише едешь точнее диагноз.
Блог арчевода - http://grif12.blogspot.com
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: удалить из одного файла те строки которые есть в другом

Сообщение watashiwa_daredeska »

Спасибо сказали:
Аватара пользователя
Dr.SMP
Сообщения: 233
ОС: Agilia & Frugalware

Re: удалить из одного файла те строки которые есть в другом

Сообщение Dr.SMP »

Чуток не то, получать ничего не нужно, нужно тупо удалить слова-строки из первого файла которые есть во втором и записать это в первый же файл, с записью я разберусь. Проблема в том что sed выводит плоды своей работы на экран (это не проблема, проблема в том что не удаляет нужные строки), это решается перенаправлением во временный файл.
Не спеши, а то успеешь, следствие - тише едешь точнее диагноз.
Блог арчевода - http://grif12.blogspot.com
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: удалить из одного файла те строки которые есть в другом

Сообщение watashiwa_daredeska »

Ну, дык и в чём проблема?

Код: Выделить всё

join -v1 <(sort -u file1) <(sort -u file2) >$tmpfile
mv $tmpfile file1
В file1 теперь строки, которых нет в file2. Что не так?
Спасибо сказали:
Аватара пользователя
Dr.SMP
Сообщения: 233
ОС: Agilia & Frugalware

Re: удалить из одного файла те строки которые есть в другом

Сообщение Dr.SMP »

Что не так?
А должно быть: в file1 теперь нет строк которые есть в file2

Я по моему понял почему мой цикл не работает:

for i in $(cat $ylst)

в $ylst (список пакетов yaourt) слова распологаются в столбик и без пробелов (слово+перевод строки), а переменная i должна иметь вид - знач1 знач2 знач3 ..... нужно попробовать заменить каретку на пробелы. Пойду погуглю.
Не спеши, а то успеешь, следствие - тише едешь точнее диагноз.
Блог арчевода - http://grif12.blogspot.com
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: удалить из одного файла те строки которые есть в другом

Сообщение SLEDopit »

Dr.SMP писал(а):
13.05.2010 19:24
это решается перенаправлением во временный файл.
у sed есть опция -i и не нужны никакие временные файлы.
Dr.SMP писал(а):
13.05.2010 17:43
for i in $(cat $ylst)
do
$tmp=$(sed "/$i/d" $plst)
echo $tmp > $plst
done
в данном коде, если в строке присутствуют пробелы, то они будут являться разделителями для переменных, и вместо одного цикла для "this pretty string" будут по отдельности прогоняться 3 цикла для "this", "pretty" и "string".
Dr.SMP писал(а):
14.05.2010 15:04
А должно быть: в file1 теперь нет строк которые есть в file2
Вы ж даже не пробовали эту команду. Если бы попробовали, то увидели, что все строки, присутствующие в file2 будут удалены из file1. Именно это вы и просите.

Код: Выделить всё

 $ df -h > file1
 $ cp file1 file2
 $ echo test >> file1
 $ join -v1 <(sort -u file1) <(sort -u file2) > result
 $ cat result
test
 $
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: удалить из одного файла те строки которые есть в другом

Сообщение t.t »

watashiwa_daredeska писал(а):
13.05.2010 20:18
В file1 теперь строки, которых нет в file2. Что не так?
Dr.SMP писал(а):
14.05.2010 15:04
Что не так?
А должно быть: в file1 теперь нет строк которые есть в file2
Объясните разницу между этими утверждениями. Потому как с логикой у меня вроде бы всегда было хортошо, но она от менря ускользнула.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Dr.SMP
Сообщения: 233
ОС: Agilia & Frugalware

Re: удалить из одного файла те строки которые есть в другом

Сообщение Dr.SMP »

В file1 теперь строки, которых нет в file2.
неясная формулировка, откуда взялись строки которых нет в file2?

в file1 теперь нет строк которые есть в file2
Подразумевает удаление строк из file1 совпадающих со строками из file2
Не спеши, а то успеешь, следствие - тише едешь точнее диагноз.
Блог арчевода - http://grif12.blogspot.com
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: удалить из одного файла те строки которые есть в другом

Сообщение t.t »

Как откуда? Из file1, конечно. Вы всё-таки попробуйте предложенный вариант.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Dr.SMP
Сообщения: 233
ОС: Agilia & Frugalware

Re: удалить из одного файла те строки которые есть в другом

Сообщение Dr.SMP »

Попробовал, помогло за что и благодарю.
Не спеши, а то успеешь, следствие - тише едешь точнее диагноз.
Блог арчевода - http://grif12.blogspot.com
Спасибо сказали: