<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=39847&amp;type=atom" />
	<updated>2018-08-10T05:12:27Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=39847</id>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461710#p461710" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Rizado пишет:</cite><blockquote><p>Если это plain text, то у Вас вполне может быть несколько сотен миллионов записей. Здесь уже выгоднее на базу данных переходить, MySQL/MariaDB или SQLite.<br />*** Добавлено: 09.08.2018 8:21:06 pm ***</p><p>pljlm8463qmw, смотрите, в чём проблема. Давайте оценим вместе объём вычислений.</p><p>Вы пишете, что файлы больше 10 гигабайт, давайте примем по 10 дял удобства расчёта, даже 10^10 байт, а не 10 * 2^30.</p><p>Если адреса почты считать в среднем по 20 символов, а с именами по 40 (в реальности так и будет или даже немного меньше), то адресов почты у Вас будет 500 миллионов, а с именами вдвое меньше - 250 миллионов. И Вы хотите взять каждый из 500 миллионов адресов (по очереди!) и сверить их (тоже по очереди) с 250 миллионами строк. То есть, сравнений будет 500 * 10^6 * 250 * 10^6 = 125 * 10^15. Впечатляет? Плюс ресурсы системы на дисковые операции (если только у вас не 32 гигабайта ОЗУ, чтобы файлы там разместить), что тоже будет тормозить процесс. Если в несколько суток закончите - считайте, Вам повезло ab .</p><p>Подумайте над оптимизацией задачи или разбивкой её на части.</p></blockquote></div><p>с базой sqllite делал уже программу на делфи,&nbsp; достаточно долгий процесс добавления такого количества записей в базу <br />Хорошая мысль! загрузить второй файл с мылами в оперативку и сделать четырехмерный массив по буквам и потом сравнивать с файлом1 тут скорость должна быть намного больше, ограниченна только скоростью чтения с диска<br /><strong>*** Добавлено: 10.08.2018 13:11:42 ***</strong></p><div class="quotebox"><cite>ormorph пишет:</cite><blockquote><p>А пардон, это не работает.<br />Как вариант одной строчкой:<br />Консоль<br />$ cat file3|dos2unix |xargs -i grep &quot;{}&quot; file2</p><p>или такой:<br />Консоль<br />$ cat file3|sed &#039;s/\r//g&#039; |xargs -i grep &quot;{}&quot; file2</p><p>Либо можно сделать скрипт bash:</p><p>#!/bin/bash<br />r1=$1<br />r2=$2<br />CR=$(echo -e &quot;\r&quot;)<br />cat $r1|while read file<br />do<br />&nbsp; &nbsp;file=${file/$CR/}<br />&nbsp; &nbsp;grep &quot;$file&quot; $r2<br />done</p><p>И уже запускать скрипт для обработки файлов:<br />Консоль<br />$ script.sh file1 file2</p></blockquote></div><br /><p>Спасибо за совет&nbsp; <img src="https://linuxforum.ru/img/smilies/bx.gif" alt="bx" /></p><p><strong>*** Добавлено: 10.08.2018 13:12:27 ***</strong></p><p>Ребята всем спасибо, помогли&nbsp; <img src="https://linuxforum.ru/img/smilies/ay.gif" alt="ay" /><br /></p>]]></content>
			<author>
				<name><![CDATA[pljlm8463qmw]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41095</uri>
			</author>
			<updated>2018-08-10T05:12:27Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461710#p461710</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461709#p461709" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>pljlm8463qmw пишет:</cite><blockquote><p>не пойму как это работает, не получается у меня правильно сделать ab</p></blockquote></div><p>А пардон, это не работает.<br />Как вариант одной строчкой:<br /><div class="termtitle" style="font-family: sans-serif; position:relative; height:auto; width:auto; background:#3A4061; color:#FFFFFF; padding: 1px;"><b> Консоль:</b></div>
<div class="termcont" style="font-family: Terminus; position:relative; height:auto; width:auto; overflow-x:scroll; white-space: nowrap ; overflow-y:auto;background:#000000; color:#4EF44E; line-height:1.2; padding: 3px; font-size: 1rem; max-height: 60vh">$ cat file3|dos2unix |xargs -i grep &quot;{}&quot; file2</div><br />или такой:<br /><div class="termtitle" style="font-family: sans-serif; position:relative; height:auto; width:auto; background:#3A4061; color:#FFFFFF; padding: 1px;"><b> Консоль:</b></div>
<div class="termcont" style="font-family: Terminus; position:relative; height:auto; width:auto; overflow-x:scroll; white-space: nowrap ; overflow-y:auto;background:#000000; color:#4EF44E; line-height:1.2; padding: 3px; font-size: 1rem; max-height: 60vh">$ cat file3|sed &#039;s/\r//g&#039; |xargs -i grep &quot;{}&quot; file2</div><br />Либо можно сделать скрипт bash:<br /></p><div class="codebox"><pre><code>#!/bin/bash
r1=$1
r2=$2
CR=$(echo -e &quot;\r&quot;)
cat $r1|while read file
do
   file=${file/$CR/}
   grep &quot;$file&quot; $r2
done</code></pre></div><p>И уже запускать скрипт для обработки файлов:<br /><div class="termtitle" style="font-family: sans-serif; position:relative; height:auto; width:auto; background:#3A4061; color:#FFFFFF; padding: 1px;"><b> Консоль:</b></div>
<div class="termcont" style="font-family: Terminus; position:relative; height:auto; width:auto; overflow-x:scroll; white-space: nowrap ; overflow-y:auto;background:#000000; color:#4EF44E; line-height:1.2; padding: 3px; font-size: 1rem; max-height: 60vh">$ script.sh file1 file2</div></p>]]></content>
			<author>
				<name><![CDATA[ormorph]]></name>
				<uri>https://linuxforum.ru/profile.php?id=221</uri>
			</author>
			<updated>2018-08-09T17:37:41Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461709#p461709</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461708#p461708" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>pljlm8463qmw пишет:</cite><blockquote><p>файлы очень большие &gt;10ГБ</p></blockquote></div><p>Если это plain text, то у Вас вполне может быть несколько сотен миллионов записей. Здесь уже выгоднее на базу данных переходить, MySQL/MariaDB или SQLite.<br /><strong>*** Добавлено: 09.08.2018 8:21:06 pm ***</strong></p><p><strong>pljlm8463qmw</strong>, смотрите, в чём проблема. Давайте оценим вместе объём вычислений.</p><p>Вы пишете, что файлы больше 10 гигабайт, давайте примем по 10 дял удобства расчёта, даже 10^10 байт, а не 10 * 2^30.</p><p>Если адреса почты считать в среднем по 20 символов, а с именами по 40 (в реальности так и будет или даже немного меньше), то адресов почты у Вас будет 500 миллионов, а с именами вдвое меньше - 250 миллионов. И Вы хотите взять каждый из 500 миллионов адресов (по очереди!) и сверить их (тоже по очереди) с 250 миллионами строк. То есть, сравнений будет 500 * 10^6 * 250 * 10^6 = 125 * 10^15. Впечатляет? Плюс ресурсы системы на дисковые операции (если только у вас не 32 гигабайта ОЗУ, чтобы файлы там разместить), что тоже будет тормозить процесс. Если в несколько суток закончите - считайте, Вам повезло <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /> .</p><p>Подумайте над оптимизацией задачи или разбивкой её на части.<br /></p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2018-08-09T17:21:06Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461708#p461708</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461707#p461707" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>ormorph пишет:</cite><blockquote><p>Не это не экранирование а удаление символов CR как вариант тогда sed &#039;s/\r//g&#039;</p></blockquote></div><p> так тоже работает спец символ \ в \r экранирует что&nbsp; sed &#039;s/\r//g&#039;&nbsp; что sed &#039;s%\r%%&#039;&nbsp; разницы нет<br /></p><div class="quotebox"><cite>ormorph пишет:</cite><blockquote><p>Ну и проще просто для grep добавить ключик -u, что бы искал без учета символов CR.</p></blockquote></div><p> не пойму как это работает, не получается у меня правильно сделать <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /><br /><strong>*** Добавлено: 10.08.2018 00:38:19 ***</strong></p><p>grep -u -f file2 file1 не работает)<br /></p>]]></content>
			<author>
				<name><![CDATA[pljlm8463qmw]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41095</uri>
			</author>
			<updated>2018-08-09T16:38:19Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461707#p461707</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461706#p461706" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>pljlm8463qmw пишет:</cite><blockquote><p>экранирование с помощью &quot;\&quot; не помогло</p></blockquote></div><p>Не это не экранирование а удаление символов <strong>CR</strong> как вариант тогда <strong>sed &#039;s/\r//g&#039; </strong><br />Ну и проще просто для grep добавить ключик <strong>-u</strong>, что бы искал без учета символов <strong>CR</strong>.</p>]]></content>
			<author>
				<name><![CDATA[ormorph]]></name>
				<uri>https://linuxforum.ru/profile.php?id=221</uri>
			</author>
			<updated>2018-08-09T16:14:28Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461706#p461706</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461705#p461705" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>ormorph пишет:</cite><blockquote><p>sed &#039;s/\r//&#039; или tr -d &quot;\r&quot;.</p></blockquote></div><p>экранирование с помощью &quot;\&quot; не помогло</p><p>sed &#039;s%\r%%g&#039; так работает</p>]]></content>
			<author>
				<name><![CDATA[pljlm8463qmw]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41095</uri>
			</author>
			<updated>2018-08-09T16:09:42Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461705#p461705</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461704#p461704" />
			<content type="html"><![CDATA[<p>Одной строчкой, то смотрите пример <strong>Rizado</strong>, просто добавить по середине еще один конвейер с командой <strong>sed &#039;s/\r//&#039;</strong> или <strong>tr -d &quot;\r&quot;</strong>.<br /><strong>*** Добавлено: 09.08.2018 19:09:31 ***</strong></p><p>Глянул, <strong>grep</strong> может искать без учета CR, для этого есть ключик <strong>-u</strong></p>]]></content>
			<author>
				<name><![CDATA[ormorph]]></name>
				<uri>https://linuxforum.ru/profile.php?id=221</uri>
			</author>
			<updated>2018-08-09T16:09:31Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461704#p461704</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461703#p461703" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>ormorph пишет:</cite><blockquote><p>Ну а если на оборот?:</p></blockquote></div><p>пробовал тоже пустой результат</p><p>инфа 100% он ищет точное совпадение походу строк и если кроме мыла другие символы в строке то пустой результат</p><p>не пойму как у Vascom работает<br /><strong>*** Добавлено: 09.08.2018 23:24:54 ***</strong></p><div class="quotebox"><cite>Vascom пишет:</cite><blockquote><p>Может проблемы из-за символов окончания строки?</p></blockquote></div><p>точно! спасибо&nbsp; </p><p>\r удалил в текстовом редакторе в файлах и всё получилось</p><p>а как бы это в одной команде сделать всё?) grep + sed ?</p><p><strong>*** Добавлено: 09.08.2018 23:25:50 ***</strong></p><p>файлы очень большие &gt;10ГБ<br /></p>]]></content>
			<author>
				<name><![CDATA[pljlm8463qmw]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41095</uri>
			</author>
			<updated>2018-08-09T15:25:50Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461703#p461703</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461702#p461702" />
			<content type="html"><![CDATA[<p>Может проблемы из-за символов окончания строки?</p>]]></content>
			<author>
				<name><![CDATA[Vascom]]></name>
				<uri>https://linuxforum.ru/profile.php?id=5339</uri>
			</author>
			<updated>2018-08-09T15:16:27Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461702#p461702</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461701#p461701" />
			<content type="html"><![CDATA[<p>на Kali linux попробовал тоже пустой вывод)))<br />какую кодировку надо у файла</p><div class="quotebox"><cite>Vascom пишет:</cite><blockquote><p>grep -f file2 file1</p></blockquote></div><div class="quotebox"><cite>Rizado пишет:</cite><blockquote><p>pljlm8463qmw, я Вам написал готовый пример, который Вы подправили. Потому и не работает.<br />Комментирую по частям:<br />cat file2.txt - вывод содержимого файла в консоль.<br />| - вертикальная черта перенаправляет вывод, вместо экрана результат передаётся следующей команде.<br />grep -f file1.txt - искать строки, содержащиеся в файле (ключ -f) file1.txt<br />&gt; results.txt - направить вывод в файл results.txt.</p></blockquote></div><p>спасибо за развернутый ответ, я понимаю о чем речь<br />grep -f file2 file1 так тоже должно работать, но у меня не работает почему-то(((</p><p>пробовал на&nbsp; windows и cygwin и на Kalilinux и результат пустой!<br />всё работает если в файл1 только мыла без разделителя :<br />если в строке не только мыло а ещё другие символы то результат пустой</p>]]></content>
			<author>
				<name><![CDATA[pljlm8463qmw]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41095</uri>
			</author>
			<updated>2018-08-09T15:14:22Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461701#p461701</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461700#p461700" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>pljlm8463qmw пишет:</cite><blockquote><p>видимо он криво работает.... ничего не пойму</p></blockquote></div><p>Ну а если на оборот?:<br /><div class="termtitle" style="font-family: sans-serif; position:relative; height:auto; width:auto; background:#3A4061; color:#FFFFFF; padding: 1px;"><b> Консоль:</b></div>
<div class="termcont" style="font-family: Terminus; position:relative; height:auto; width:auto; overflow-x:scroll; white-space: nowrap ; overflow-y:auto;background:#000000; color:#4EF44E; line-height:1.2; padding: 3px; font-size: 1rem; max-height: 60vh">$ grep -f file1 file2</div></p>]]></content>
			<author>
				<name><![CDATA[ormorph]]></name>
				<uri>https://linuxforum.ru/profile.php?id=221</uri>
			</author>
			<updated>2018-08-09T15:05:06Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461700#p461700</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461699#p461699" />
			<content type="html"><![CDATA[<p><strong>pljlm8463qmw</strong>, я Вам написал готовый пример, который Вы подправили. Потому и не работает.<br />Комментирую по частям:<br />cat file2.txt - вывод содержимого файла в консоль.<br />| - вертикальная черта перенаправляет вывод, вместо экрана результат передаётся следующей команде.<br />grep -f file1.txt - искать строки, содержащиеся в файле (ключ -f) file1.txt<br />&gt; results.txt - направить вывод в файл results.txt.<br />Всё вместе:<br /><div class="termtitle" style="font-family: sans-serif; position:relative; height:auto; width:auto; background:#3A4061; color:#FFFFFF; padding: 1px;"><b> Консоль:</b></div>
<div class="termcont" style="font-family: Terminus; position:relative; height:auto; width:auto; overflow-x:scroll; white-space: nowrap ; overflow-y:auto;background:#000000; color:#4EF44E; line-height:1.2; padding: 3px; font-size: 1rem; max-height: 60vh">cat file2.txt | grep -f file1.txt &gt; results.txt</div><br />Так и вводите, одной командой и в одну строку. Только имена файлов свои подставьте.</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2018-08-09T13:17:34Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461699#p461699</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461698#p461698" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Vascom пишет:</cite><blockquote><p>Я попробовал - всё работает:<br /></p><div class="codebox"><pre><code>$ grep -f file2 file1
vasya@mail.ru:Vasya
petya@list.ru:Petr Ivanov
sasha@bk.ru:Sasha S.</code></pre></div></blockquote></div><br /><p>я пробую на windows в&nbsp; cygwin</p><p>видимо он криво работает.... ничего не пойму</p>]]></content>
			<author>
				<name><![CDATA[pljlm8463qmw]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41095</uri>
			</author>
			<updated>2018-08-09T13:12:57Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461698#p461698</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461697#p461697" />
			<content type="html"><![CDATA[<p>Я попробовал - всё работает:<br /></p><div class="codebox"><pre><code>$ grep -f file2 file1
vasya@mail.ru:Vasya
petya@list.ru:Petr Ivanov
sasha@bk.ru:Sasha S.</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Vascom]]></name>
				<uri>https://linuxforum.ru/profile.php?id=5339</uri>
			</author>
			<updated>2018-08-09T12:56:55Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461697#p461697</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: grep или чем ещё можно выбрать все строки файла1 из файла2?]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461696#p461696" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Rizado пишет:</cite><blockquote><div class="quotebox"><cite>pljlm8463qmw пишет:</cite><blockquote><p>вот сам попробуй</p></blockquote></div><p>Для начала просьба повежливее. Я не давал согласия на &quot;ты&quot;.</p></blockquote></div><p>прошу&nbsp; прощения</p>]]></content>
			<author>
				<name><![CDATA[pljlm8463qmw]]></name>
				<uri>https://linuxforum.ru/profile.php?id=41095</uri>
			</author>
			<updated>2018-08-09T12:53:02Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461696#p461696</id>
		</entry>
</feed>
