grep из 50000 строк в большом улучшении производительности файла - PullRequest
0 голосов
/ 12 июля 2020

У меня есть файл размером около 200 МБ, в котором около 1,2 млн строк. Скажем, read.txt. У меня есть еще один файл input.txt, в котором около 50000 строк. Я хочу взять строку в каждой строке из файла input.txt и grep в read.txt. Для совпадающей строки в read.txt получите эту полную строку и запишите в другой файл output.txt. На данный момент я просматриваю каждую строку файла input.txt, grep в файле read.txt. Этот подход требует более 1 часа времени. Есть ли возможность повысить производительность, чтобы сократить время, затрачиваемое на этот процесс.

    while read line
    do
            LC_ALL=C grep ${line} reading.txt 2>/dev/null
    done<input.txt >> output.txt

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

man grep дает (среди прочего):

       -f FILE, --file=FILE
              Obtain patterns from FILE, one per line.  If this option is used
              multiple times or is combined with  the  -e  (--regexp)  option,
              search  for  all  patterns  given.  The empty file contains zero
              patterns, and therefore matches nothing.
0 голосов
/ 13 июля 2020
grep -f input.txt reading.txt > output.txt

... напечатает все строки в 'read.txt' с подстрокой, соответствующей строке в 'input.txt', в порядке файла 'reading.txt', в 'output.txt'

Вы не указываете это, но это может иметь значение (вы сказали строки 1,2 МБ в 'read.txt') - отдельный выходной файл для каждой совпадающей строки:

#!/bin/sh

nl='
'
IFS=$nl

c=0
for i in $(grep -f input.txt reading.txt); do
        c=$((c+1))
        echo "$i" > output$c.txt
done

Там есть более аккуратные методы установки IFS на новую строку, например, в bash: IFS=$'\n' (также вы можете использовать > output$((++c)).txt в bash)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...