удалить версию всех пакетов в файле

у меня есть два файла package32.txt - packages64.txt, и теперь мне нужна разница между файлами, поэтому я думаю, что лучше удалить версии.

sys-libs/libseccomp-2.1.1
sys-libs/libunwind-1.1
sys-libs/libutempter-1.1.6-r1
sys-libs/mtdev-1.1.5
sys-libs/ncurses-6.0-r1
sys-power/upower-0.99.2-r1
sys-process/cronbase-0.3.3
sys-process/htop-1.0.3
sys-process/lsof-4.88-r1

Я думаю, что лучшая идея - удалить версию каждой строки. Есть ли способ справиться с этим в Linux? В файле больше записи, всего вместе было 1500 строк только в 32 txt файле.

Спасибо за помощь и хорошие выходные Сильвио


person Silvio    schedule 29.01.2016    source источник
comment
Вы уверены, что программа, сгенерировавшая этот список, не может сгенерировать его в другом формате? Например, где номер версии отделен пробелом от имени пакета? Ваша задача была бы намного проще.   -  person Rany Albeg Wein    schedule 30.01.2016


Ответы (2)


вам нужно определить, какую разницу вы хотите. Разность множеств не коммутативна.

Например

$ comm -23 <(sort file1) <(sort file2)

даст установленную разницу File1 \ File2 (уникальные записи в File1), тогда как

$ comm -13 <(sort file1) <(sort file2)

будет установлена ​​разница File2 \ File2

На реальном примере:

$ comm -23 <(echo -e 'a\nb\nc') <(echo -e 'c\nd\ne')
a
b

$ comm -13 <(echo -e 'a\nb\nc') <(echo -e 'c\nd\ne')
d
e

Если вы хотите провести сравнение без номеров версий, сначала вам нужно их обрезать. Судя по приведенному выше образцу, похоже, что -[0-9] — это шаблон для поиска.

$ f() { sed 's/-[0-9].*//' $1 | sort; }; comm <(f file1) <(f file2)

который даст вам три столбца: уникальный в файле1, уникальный в файле2, общий в файле1 и файле2. Или, используя указанные выше опции, вы можете получить только различия.

person karakfa    schedule 29.01.2016
comment
Здравствуйте, спасибо за ответ. Я хочу, чтобы в конце было два файла, в которых есть только sys-libs/libseccomp sys-libs/libunwind, тогда я смогу лучше видеть, что установлено, а что нет в дереве amd64. Gentoo amd64 и x86 часто имеют одно и то же программное обеспечение, установленное только в другой версии. Когда версия отсутствует, я могу лучше видеть, что нужно устанавливать, а что нет. - person Silvio; 30.01.2016

diff -u <(sed 's/-[0-9].*$//' packages32.txt | sort) <(sed 's/-[0-9].*$//' packages64.txt | sort)

sed удалит часть -version каждого файла перед передачей результата в sort. Оба результата идут к diff. diff будет отображать строки только в первом файле (packages32.txt), начиная с -, и показывать строки только во втором файле (packages64.txt), начиная с +.

person Joao Morais    schedule 30.01.2016