[Решено] Сравнение двух файлов

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

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

storm2005
Сообщения: 136

[Решено] Сравнение двух файлов

Сообщение storm2005 »

Необходимо сравнить два файла.

Изначальная задача.
Есть много каталогов (более миллиона). Некоторые из них необходимо удалить со всем содержимым около (400 тыс.). Есть список с именами каталогов, но без путей.

Вот так получаю все каталоги
find /root/test1/dir $pwd -type d |sort |uniq > 1.tmp
на выходе файл 1.tmp

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

/root/test1/dir
/root/test1/dir/11
/root/test1/dir/11/1
/root/test1/dir/11/2
/root/test1/dir/11/3
/root/test1/dir/11/4
/root/test1/dir/11/5
/root/test1/dir/12
/root/test1/dir/12/1
/root/test1/dir/12/2


Файл 2.tmp

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

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

/root/test1/dir/12
/root/test1/dir/12/1
/root/test1/dir/12/2
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: [Решено] Сравнение двух файлов

Сообщение SLEDopit »

если 2.tmp небольшое (порядка 5 вариантов), то проще сделать вот так:

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

find /root/test1/dir $pwd -type d |sort -u | grep -vE "11|13|etc" > out.tmp
если большой, то вот так:

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

echo '#!/bin/sed -f' > 2.sed; cat 2.tmp | sed 's=^=/=;s=$=/d;' >> 2.sed; chmod +x 2.sed; ./2.sed 1.tmp > out.tmp
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.
Спасибо сказали:
storm2005
Сообщения: 136

Re: [Решено] Сравнение двух файлов

Сообщение storm2005 »

SLEDopit писал(а):
15.03.2011 14:29
если 2.tmp небольшое (порядка 5 вариантов), то проще сделать вот так:

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

find /root/test1/dir $pwd -type d |sort -u | grep -vE "11|13|etc" > out.tmp
если большой, то вот так:

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

echo '#!/bin/sed -f' > 2.sed; cat 2.tmp | sed 's=^=/=;s=$=/d;' >> 2.sed; chmod +x 2.sed; ./2.sed 1.tmp > out.tmp


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

echo '#!/bin/sed -f' > 2.sed; cat 2.tmp | sed 's=^=/=;s=$=/d;' >> 2.sed; chmod +x 2.sed; ./2.sed 1.tmp > out.tmp
sed: -e выражение #1, символ 14: незавершенная команда `s'

Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: [Решено] Сравнение двух файлов

Сообщение SLEDopit »

storm2005 писал(а):
15.03.2011 14:38
sed: -e выражение #1, символ 14: незавершенная команда `s'
символ забыл:

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

echo '#!/bin/sed -f' > 2.sed; cat 2.tmp | sed 's=^=/=;s=$=/d=;' >> 2.sed; chmod +x 2.sed; ./2.sed 1.tmp > out.tmp
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.
Спасибо сказали:
storm2005
Сообщения: 136

Re: [Решено] Сравнение двух файлов

Сообщение storm2005 »

cat out.tmp

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

/root/test1/dir
/root/test1/dir/12
/root/test1/dir/12/1
/root/test1/dir/12/2
/root/test1/dir/12/3
/root/test1/dir/12/4
/root/test1/dir/12/5
/root/test1/dir/14
/root/test1/dir/14/1
/root/test1/dir/14/2
/root/test1/dir/14/3
/root/test1/dir/14/4
/root/test1/dir/14/5


Можно избавиться от строк с корневыми каталогами, типа

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

/root/test1/dir?
Спасибо сказали:
storm2005
Сообщения: 136

Re: [Решено] Сравнение двух файлов

Сообщение storm2005 »

Сделал грепом

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

#!/bin/sh

patch="/root/test1/dir"

find $patch $pwd -type d |sort |uniq |
grep -v '/root/test1/dir$' |
grep -v '/root/test1/dir/..$' > 1.tmp

echo '#!/bin/sed -f' > 2.sed; cat 2.tmp | sed 's=^=/=;s=$=/d=;' >> 2.sed; chmod +x 2.sed; ./2.sed 1.tmp > out.tmp
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: [Решено] Сравнение двух файлов

Сообщение SLEDopit »

storm2005 писал(а):
15.03.2011 16:05
Можно избавиться от строк с корневыми каталогами, типа
Если корневые это те, которые оканчиваются на буквы, а некорневые - на цифры, то вот так:

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

sed -i '/[0-9]$/!d' out.tmp
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.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: [Решено] Сравнение двух файлов

Сообщение sash-kan »

можно обойтись одним find-ом:
$ find /root/test1/dir $pwd -regextype posix-egrep -type d -not -regex ".*/(11|13)"

p.s. если исключений (в файле 2.tmp) — порядка десятков/сотен, то, чтоб вручную их не набивать, можно последний элемент так примерно написать:
… -regex ".*/($(cat 2.tmp | sed -rn '$!H;${G;s/\n+/|/g;p}'))"
правда, если исключений тысячи, этот вариант, боюсь, может не прокатить.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
storm2005
Сообщения: 136

Re: [Решено] Сравнение двух файлов

Сообщение storm2005 »

sash-kan писал(а):
15.03.2011 18:20
можно обойтись одним find-ом:
$ find /root/test1/dir $pwd -regextype posix-egrep -type d -not -regex ".*/(11|13)"

p.s. если исключений (в файле 2.tmp) — порядка десятков/сотен, то, чтоб вручную их не набивать, можно последний элемент так примерно написать:
… -regex ".*/($(cat 2.tmp | sed -rn '$!H;${G;s/\n+/|/g;p}'))"
правда, если исключений тысячи, этот вариант, боюсь, может не прокатить.


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

find /root/test1/dir $pwd -regextype posix-egrep -type d -not -regex ".*/($(cat 2.tmp | sed -rn '$!H;${G;s/\n+/|/g;p}'))"
bash: !H: event not found


В фале 2.tmp при условии не совпадения с 1.tmp 1,5 мил. записей. При условии совпадения 400 тыс. записей.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: [Решено] Сравнение двух файлов

Сообщение sash-kan »

storm2005 писал(а):
16.03.2011 10:06
bash: !H: event not found
ну вынесите из кавычек конструкцию $(…)
только пихать сотню тысяч записей в командную строку, конечено, нет смысла. делайте конвейером, варианты вам тут уже расписали,
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: