Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 06.12.2018
Сообщений: 4

Добавление недостающих строк при сравнении двух файлов

06.12.2018, 10:14. Показов 1844. Ответов 11

Студворк — интернет-сервис помощи студентам
Добрый день!

В postfix часто приходится вносить множество адресов для блокировки спама и прочей разной неведомой херни.
Есть 2 файла Source и Destination. В Source список адресов, которые УЖЕ блокируется или разрешается. В Destination - то что нужно заблокировать.

Пример Destination:
Code
1
2
3
4
5
kraftaudio.ru REJECT
foc-ug.ru REJECT
xxx.ru OK
sfdfsdf.com OK
146.34.121.15 REJECT
Пример Source:
Code
1
2
3
4
siet.com
foc-ug.ru
xxx.ru
10.10.10.20
Нужно сравнить эти файлы и добавить из Source в Destination то чего там нет. При этом логика такая:
если значение там есть, то ничего не добавлять.
если значение там "xxx.ru OK" то заменить его на "xxx.ru REJECT"
если значения там нет, то нужно его добавить в виде "адрес REJECT"

Добавлено через 55 минут
Вот такое пока что наваял.

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
Source_file=/home/user/source.file
Dest_file=/home/user/dest.file
 
IFS-$'\n'
set -f
 
for var in $(cat $Source_file)
do
      if grep -iq $var $Dest_file
then
      echo "$var already is in file!!"
else
      echo "$var REJECT will be added to $Dest_file"
fi
done
Добавлено через 11 минут
вот только не понятно как заменять одну переменную в цикле на другую((
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.12.2018, 10:14
Ответы с готовыми решениями:

Не учитывается регистр при сравнении двух строк
Всех приветствую! Хотел узнать следующее: почему при следующем запросе SELECT * from users where = 'user' and = 'qwerty' ...

Type mismatch при сравнении двух строк
Здравствуйте, уважаемые форумчане! При сравнении двух переменных : элемента коллекции типа строка и строчной переменной получаю ошибку...

Зацикливание при сравнении строк
Добрый вечер. У меня возникла проблема при сравнивании строк, после сравнивания происходит расчет по циклу и далее по идее должно...

11
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
06.12.2018, 12:19
Цитата Сообщение от isergwind Посмотреть сообщение
xxx.ru OK
Это только для одного файла менять ОК на REJECT?
0
 Аватар для volodin661
6627 / 2258 / 346
Регистрация: 10.12.2013
Сообщений: 7,809
06.12.2018, 12:52
Если по-простому, без изысков

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env perl -w
use strict;
 
open SRC, "Source.file"      or die $!;
open DST, "Destination.file" or die $!;
 
undef $/;
my @src = <SRC> =~ /\S+/mg;
my %dst = <DST> =~ /(\S+)\s+(REJECT|OK)/mgi;
 
close SRC;
close DST;
 
$dst{"\L$_"} = "REJECT" for @src;
 
open NEW, ">Destination.new" or die $!;
for ( sort keys %dst ) {
 
    printf NEW "%-20s %-s\n", $_, $dst{$_};
}    
 
 
print "Result in the file Destination.new\n";
1
0 / 0 / 0
Регистрация: 06.12.2018
Сообщений: 4
06.12.2018, 14:36  [ТС]
Цитата Сообщение от Marinero Посмотреть сообщение
Это только для одного файла менять ОК на REJECT?
Да, только для одного. А так файлов всего два. В Destination файле множество значений как с REJECT так и ОК.
В файле Source только строки c ip или доменами, без REJECT

Добавлено через 3 минуты
volodin661, Ойойой, perl. Не особо нем не понимаю, даже если потом захочу что-то подправить, то это будет проблема. А с башем нельзя такое? В любом случае спасибо!
0
 Аватар для volodin661
6627 / 2258 / 346
Регистрация: 10.12.2013
Сообщений: 7,809
06.12.2018, 15:03
Цитата Сообщение от isergwind Посмотреть сообщение
Ойойой, perl. Не особо нем не понимаю
Но на bash ты тоже не смог выполнить задуманное, поэтому фактически разницы никакой.
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
06.12.2018, 17:01
Цитата Сообщение от isergwind Посмотреть сообщение
с башем нельзя такое?
Можно. Самое простое: добавить в DEST строки из SOURCE с добавленным REJECT, отсортировать и удалить дубли. В итоге останутся первоначальные строки. Только плюсом сделать проверку на xxx.ru.
А так можно и Вашим способом:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while read var ; do
 
    if [ "$var" = "xxx.ru" ] ; then
        sed -i "/$var/s/OK/REJECT/" "$Dest_file"
        continue
    fi
 
    if grep -iqF "$var" "$Dest_file" ; then
        echo "$var already is in file!!"
    else
        echo "$var REJECT" >>"$Dest_file"
        echo "$var REJECT will be added to $Dest_file"
    fi
 
done <"$Source_file"
Добавлено через 33 минуты
Bash
1
2
3
4
5
if grep -iFq "xxx.ru" "$Source_file" ; then
    sed -i "/xxx.ru/s/OK/REJECT/" "$Dest_file"
fi
cat <"$Dest_file" <(sed 's/$/ REJECT/' "$Source_file") | sort -uk1,1 >"$Dest_file".new
mv "$Dest_file"{.new,}
0
0 / 0 / 0
Регистрация: 06.12.2018
Сообщений: 4
10.12.2018, 07:43  [ТС]
Цитата Сообщение от Marinero Посмотреть сообщение
Можно. Самое простое: добавить в DEST строки из SOURCE с добавленным REJECT, отсортировать и удалить дубли. В итоге останутся первоначальные строки. Только плюсом сделать проверку на xxx.ru.
Добрый день!
Отличная идея - добавить в Dest строки из Source с добавлением REGECT. А как тогда отсортировать дубли и удалить то, где встречается ОК ? В итоге в файле будут строки
yyy.ru OK
zzz.ru OK
xxx.ru OK
xxx.ru REGECT
То что не поменялось на REGECT должно остаться.

Дело в том, что подобных записей как xxx.ru OK там много и нет смысла грепать только одну строку "xxx.ru".
0
 Аватар для volodin661
6627 / 2258 / 346
Регистрация: 10.12.2013
Сообщений: 7,809
10.12.2018, 08:42
все эти конфигурации, кстати, имеет смысл заправить в Makefile.
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
10.12.2018, 10:47
Цитата Сообщение от isergwind Посмотреть сообщение
отсортировать дубли и удалить то, где встречается ОК
Bash
1
2
cat <(sed 's/$/ REJECT/' "$Source_file") <"$Dest_file" | sort -uk1,1 >"$Dest_file".new
mv -f "$Dest_file"{.new,}
Добавлено через 6 минут
Цитата Сообщение от isergwind Посмотреть сообщение
нет смысла грепать только одну строку "xxx.ru"
Можно наоборот:
Bash
1
2
3
grep -vFf "$Source_file" "$Dest_file" >"$Dest_file".new
sed 's/$/REJECT/'  "$Source_file" >>"$Dest_file".new
mv -f "$Dest_file"{.new,}
0
0 / 0 / 0
Регистрация: 06.12.2018
Сообщений: 4
11.12.2018, 08:54  [ТС]
volodin661, Добрый день! Подскажите пожалуйста, как изменить Ваш скрипт чтобы вывод был сразу в Destination.file а не в Destination.new ?

Идея-то здесь простая: сначала собрать в Source.file то что надо блокировать. Затем запустить скрипт, который добавит все значения в Destination.file.
0
 Аватар для volodin661
6627 / 2258 / 346
Регистрация: 10.12.2013
Сообщений: 7,809
11.12.2018, 11:13
Цитата Сообщение от isergwind Посмотреть сообщение
как изменить Ваш скрипт чтобы вывод был сразу в Destination.file а не в Destination.new ?
Заменить в строке 16 слова

">Destination.new"

на

">Destination.file"
0
 Аватар для YupiRex
189 / 146 / 32
Регистрация: 04.10.2013
Сообщений: 150
12.12.2018, 11:33
Цитата Сообщение от isergwind Посмотреть сообщение
если значение там есть, то ничего не добавлять.
ничего не выполнять
Цитата Сообщение от isergwind Посмотреть сообщение
если значение там "xxx.ru OK" то заменить его на "xxx.ru REJECT"
Bash
1
grep -F "$(grep OK sour-dest/Destination |cut -d' ' -f1 )" sour-dest/Source |xargs -Iarg sed -i 's/arg.*/arg REJECT/g' sour-dest/Destination
Цитата Сообщение от isergwind Посмотреть сообщение
если значения там нет, то нужно его добавить в виде "адрес REJECT"
Bash
1
grep -vF "$(cut -d' ' -f1 sour-dest/Destination)" sour-dest/Source |xargs -Iarg echo arg REJECT >> sour-dest/Destination
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2018, 11:33
Помогаю со студенческими работами здесь

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

Кодировка при сравнении строк
Всем привет! Про кодировки читал много на вашем форуме, однако применить к своей задаче так и не получилось. Попробую понятно описать...

Ошибка при сравнении строк
Привет всем! Задача стояла такая, написать программу, которая бы три раза спрашивала пароль, и после 3й неудачной попытки завершалась бы!...

Найти ошибку при сравнении файлов
Помогите,пожалуйста найти ошибку. По заданию надо описать логическую функцию eq(f,q),проверяющая на равенство файлы f и g. Файлы типа type...

Игнорировать регистр при сравнении строк
Как сделать так, чтобы программа не обращала внимания на регистр. Например я пишу: if (textBox1.Text.Contains(&quot;Мат&quot;)) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru