Задача
       
нужно выбрать из файла2 строки c email:fio из файла1

в файле2 строки с емэйлом и фио, а в файле1 только емэйлы
разделитель :


пример файлов

файл2  email:fio
vasya@mail.ru:Vasya
petya@list.ru:Petr Ivanov
sasha@bk.ru:Sasha S.


файл1  email
vasya@mail.ru
petya@list.ru
blabla@bla.ru

2

Да чем угодно. На PHP или Python можно скрипт написать быстро. То есть, как я понял, в первом файле, без имён, может быть почта, которой нет во втором и это выбирать не надо? Правильно?

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD + NVIDIA GeForce RTX3060, DDR4 32 GB, SSD 1TB + HDD 2TB | Linux Mint 22.3 Cinnamon + Windows 11

3

Rizado пишет:

Да чем угодно. На PHP или Python можно скрипт написать быстро. То есть, как я понял, в первом файле, без имён, может быть почта, которой нет во втором и это выбирать не надо? Правильно?


да

а можно без  PHP или Python стандартными средствами unix  grep sed awk или ещё как?)

4

pljlm8463qmw пишет:

а можно без  PHP или Python стандартными средствами unix  grep sed awk или ещё как?)

Тогда не ко мне вопрос.
*** Добавлено: 09.08.2018 1:39:53 pm ***

В общем, что Вам мешало сделать то же, что и я?
1. Набираем в консоли grep --help.
2. Смотрим на опцию -f.
В итоге получилось:

 Консоль:
cat file2.txt | grep -f file1.txt

То, что надо?
При желании можно перенаправить вывод в файл:
 Консоль:
cat file2.txt | grep -f file1.txt > results.txt

P.S. Исправил опечатку.

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD + NVIDIA GeForce RTX3060, DDR4 32 GB, SSD 1TB + HDD 2TB | Linux Mint 22.3 Cinnamon + Windows 11

5

pljlm8463qmw,  ab с grep нужно будет указывать где искать и что искать.
По сути это простой разгребатель хлама на диске.

Linux Mint 19.3 Mate Edition
Windows 7

6

Rizado пишет:
pljlm8463qmw пишет:

а можно без  PHP или Python стандартными средствами unix  grep sed awk или ещё как?)

Тогда не ко мне вопрос.
*** Добавлено: 09.08.2018 1:39:53 pm ***

В общем, что Вам мешало сделать то же, что и я?
1. Набираем в консоли grep --help.
2. Смотрим на опцию -f.
В итоге получилось:

 Консоль:
cat file2.txt | grep -f file1.txt

То, что надо?
При желании можно перенаправить вывод в файл:
 Консоль:
cat file2.txt | grep -f file1.txt > results.txt

P.S. Исправил опечатку.

я так пробовал уже не находит из-за спецсимвола наверно в строке или не знаю из-за чего
grep -w -f file2.txt file1.txt>result.txt

вот сам попробуй

пример файла1

vasya@mail.ru:Vasya
petya@list.ru:Petr Ivanov
sasha@bk.ru:Sasha S.

пример файла2

vasya@mail.ru
blabla@bla.ru
petya@list.ru
blabla1@bla.ru
blabla2@bla.ru
blabla@3bla.ru
blabla4@bla.ru
sasha@bk.ru
blabla7@bla.ru

result.txt пустой получается (

7

pljlm8463qmw пишет:

вот сам попробуй

Для начала просьба повежливее. Я не давал согласия на "ты".

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD + NVIDIA GeForce RTX3060, DDR4 32 GB, SSD 1TB + HDD 2TB | Linux Mint 22.3 Cinnamon + Windows 11

8

Rizado пишет:
pljlm8463qmw пишет:

вот сам попробуй

Для начала просьба повежливее. Я не давал согласия на "ты".

прошу  прощения

9

Я попробовал - всё работает:

$ grep -f file2 file1
vasya@mail.ru:Vasya
petya@list.ru:Petr Ivanov
sasha@bk.ru:Sasha S.

10

Vascom пишет:

Я попробовал - всё работает:

$ grep -f file2 file1
vasya@mail.ru:Vasya
petya@list.ru:Petr Ivanov
sasha@bk.ru:Sasha S.

я пробую на windows в  cygwin

видимо он криво работает.... ничего не пойму

11

pljlm8463qmw, я Вам написал готовый пример, который Вы подправили. Потому и не работает.
Комментирую по частям:
cat file2.txt - вывод содержимого файла в консоль.
| - вертикальная черта перенаправляет вывод, вместо экрана результат передаётся следующей команде.
grep -f file1.txt - искать строки, содержащиеся в файле (ключ -f) file1.txt
> results.txt - направить вывод в файл results.txt.
Всё вместе:

 Консоль:
cat file2.txt | grep -f file1.txt > results.txt

Так и вводите, одной командой и в одну строку. Только имена файлов свои подставьте.

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD + NVIDIA GeForce RTX3060, DDR4 32 GB, SSD 1TB + HDD 2TB | Linux Mint 22.3 Cinnamon + Windows 11

12

pljlm8463qmw пишет:

видимо он криво работает.... ничего не пойму

Ну а если на оборот?:

 Консоль:
$ grep -f file1 file2

13

на Kali linux попробовал тоже пустой вывод)))
какую кодировку надо у файла

Vascom пишет:

grep -f file2 file1

Rizado пишет:

pljlm8463qmw, я Вам написал готовый пример, который Вы подправили. Потому и не работает.
Комментирую по частям:
cat file2.txt - вывод содержимого файла в консоль.
| - вертикальная черта перенаправляет вывод, вместо экрана результат передаётся следующей команде.
grep -f file1.txt - искать строки, содержащиеся в файле (ключ -f) file1.txt
> results.txt - направить вывод в файл results.txt.

спасибо за развернутый ответ, я понимаю о чем речь
grep -f file2 file1 так тоже должно работать, но у меня не работает почему-то(((

пробовал на  windows и cygwin и на Kalilinux и результат пустой!
всё работает если в файл1 только мыла без разделителя :
если в строке не только мыло а ещё другие символы то результат пустой

14

Может проблемы из-за символов окончания строки?

15

ormorph пишет:

Ну а если на оборот?:

пробовал тоже пустой результат

инфа 100% он ищет точное совпадение походу строк и если кроме мыла другие символы в строке то пустой результат

не пойму как у Vascom работает
*** Добавлено: 09.08.2018 23:24:54 ***

Vascom пишет:

Может проблемы из-за символов окончания строки?

точно! спасибо 

\r удалил в текстовом редакторе в файлах и всё получилось

а как бы это в одной команде сделать всё?) grep + sed ?

*** Добавлено: 09.08.2018 23:25:50 ***

файлы очень большие >10ГБ

16 (09.08.2018 19:09:55 отредактировано ormorph)

Одной строчкой, то смотрите пример Rizado, просто добавить по середине еще один конвейер с командой sed 's/\r//' или tr -d "\r".
*** Добавлено: 09.08.2018 19:09:31 ***

Глянул, grep может искать без учета CR, для этого есть ключик -u

17

ormorph пишет:

sed 's/\r//' или tr -d "\r".

экранирование с помощью "\" не помогло

sed 's%\r%%g' так работает

18

pljlm8463qmw пишет:

экранирование с помощью "\" не помогло

Не это не экранирование а удаление символов CR как вариант тогда sed 's/\r//g'
Ну и проще просто для grep добавить ключик -u, что бы искал без учета символов CR.

19

ormorph пишет:

Не это не экранирование а удаление символов CR как вариант тогда sed 's/\r//g'

так тоже работает спец символ \ в \r экранирует что  sed 's/\r//g'  что sed 's%\r%%'  разницы нет

ormorph пишет:

Ну и проще просто для grep добавить ключик -u, что бы искал без учета символов CR.

не пойму как это работает, не получается у меня правильно сделать ab
*** Добавлено: 10.08.2018 00:38:19 ***

grep -u -f file2 file1 не работает)

20

pljlm8463qmw пишет:

файлы очень большие >10ГБ

Если это plain text, то у Вас вполне может быть несколько сотен миллионов записей. Здесь уже выгоднее на базу данных переходить, MySQL/MariaDB или SQLite.
*** Добавлено: 09.08.2018 8:21:06 pm ***

pljlm8463qmw, смотрите, в чём проблема. Давайте оценим вместе объём вычислений.

Вы пишете, что файлы больше 10 гигабайт, давайте примем по 10 дял удобства расчёта, даже 10^10 байт, а не 10 * 2^30.

Если адреса почты считать в среднем по 20 символов, а с именами по 40 (в реальности так и будет или даже немного меньше), то адресов почты у Вас будет 500 миллионов, а с именами вдвое меньше - 250 миллионов. И Вы хотите взять каждый из 500 миллионов адресов (по очереди!) и сверить их (тоже по очереди) с 250 миллионами строк. То есть, сравнений будет 500 * 10^6 * 250 * 10^6 = 125 * 10^15. Впечатляет? Плюс ресурсы системы на дисковые операции (если только у вас не 32 гигабайта ОЗУ, чтобы файлы там разместить), что тоже будет тормозить процесс. Если в несколько суток закончите - считайте, Вам повезло ab .

Подумайте над оптимизацией задачи или разбивкой её на части.

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD + NVIDIA GeForce RTX3060, DDR4 32 GB, SSD 1TB + HDD 2TB | Linux Mint 22.3 Cinnamon + Windows 11

21

pljlm8463qmw пишет:

не пойму как это работает, не получается у меня правильно сделать ab

А пардон, это не работает.
Как вариант одной строчкой:

 Консоль:
$ cat file3|dos2unix |xargs -i grep "{}" file2

или такой:
 Консоль:
$ cat file3|sed 's/\r//g' |xargs -i grep "{}" file2

Либо можно сделать скрипт bash:

#!/bin/bash
r1=$1
r2=$2
CR=$(echo -e "\r")
cat $r1|while read file
do
   file=${file/$CR/}
   grep "$file" $r2
done

И уже запускать скрипт для обработки файлов:

 Консоль:
$ script.sh file1 file2

22

Rizado пишет:

Если это plain text, то у Вас вполне может быть несколько сотен миллионов записей. Здесь уже выгоднее на базу данных переходить, MySQL/MariaDB или SQLite.
*** Добавлено: 09.08.2018 8:21:06 pm ***

pljlm8463qmw, смотрите, в чём проблема. Давайте оценим вместе объём вычислений.

Вы пишете, что файлы больше 10 гигабайт, давайте примем по 10 дял удобства расчёта, даже 10^10 байт, а не 10 * 2^30.

Если адреса почты считать в среднем по 20 символов, а с именами по 40 (в реальности так и будет или даже немного меньше), то адресов почты у Вас будет 500 миллионов, а с именами вдвое меньше - 250 миллионов. И Вы хотите взять каждый из 500 миллионов адресов (по очереди!) и сверить их (тоже по очереди) с 250 миллионами строк. То есть, сравнений будет 500 * 10^6 * 250 * 10^6 = 125 * 10^15. Впечатляет? Плюс ресурсы системы на дисковые операции (если только у вас не 32 гигабайта ОЗУ, чтобы файлы там разместить), что тоже будет тормозить процесс. Если в несколько суток закончите - считайте, Вам повезло ab .

Подумайте над оптимизацией задачи или разбивкой её на части.

с базой sqllite делал уже программу на делфи,  достаточно долгий процесс добавления такого количества записей в базу
Хорошая мысль! загрузить второй файл с мылами в оперативку и сделать четырехмерный массив по буквам и потом сравнивать с файлом1 тут скорость должна быть намного больше, ограниченна только скоростью чтения с диска
*** Добавлено: 10.08.2018 13:11:42 ***

ormorph пишет:

А пардон, это не работает.
Как вариант одной строчкой:
Консоль
$ cat file3|dos2unix |xargs -i grep "{}" file2

или такой:
Консоль
$ cat file3|sed 's/\r//g' |xargs -i grep "{}" file2

Либо можно сделать скрипт bash:

#!/bin/bash
r1=$1
r2=$2
CR=$(echo -e "\r")
cat $r1|while read file
do
   file=${file/$CR/}
   grep "$file" $r2
done

И уже запускать скрипт для обработки файлов:
Консоль
$ script.sh file1 file2


Спасибо за совет  bx

*** Добавлено: 10.08.2018 13:12:27 ***

Ребята всем спасибо, помогли  ay