У меня около 2 ТБ файлов данных, отформатированных как
12/20/2015 somerandomdata
12/20/2015 somerandomdata
12/20/2015 somerandomdata
12/20/2015 somerandomdata
12/21/2015 somerandomdata
12/21/2015 somerandomdata
12/21/2015 somerandomdata
12/21/2015 somerandomdata
12/22/2015 somerandomdata
12/22/2015 somerandomdata
12/22/2015 somerandomdata
12/22/2015 somerandomdata
и я хочу вытащить определенные даты. Например, я мог бы хотеть генерировать файлы для 20.12.2015 и 22.12.2015.
12/20/2015 somerandomdata
12/20/2015 somerandomdata
12/20/2015 somerandomdata
12/20/2015 somerandomdata
а также
12/22/2015 somerandomdata
12/22/2015 somerandomdata
12/22/2015 somerandomdata
12/22/2015 somerandomdata
Я мог бы легко сделать это с помощью grep в linux, выполнив grep '12/20/2015' filein > fileout20
и grep '12/22/2015' filein > fileout22
но это имеет две проблемы.
Во-первых, что более важно, он должен дважды просмотреть входной файл, чтобы сгенерировать вывод. С 2 ТБ данных и несколькими датами на файл это серьезная проблема. (Связанный: я также не хочу решений, которые разбивают файл на каждую возможную дату, потому что мне не нужны данные за большинство дат, всего около 10% от каждого входного файла)
Вторая проблема заключается в том, что мне нужно запустить это на Windows. (Я понимаю, что большинство команд Linux имеют Windows-эквивалент, использующий GnuWin32 или тому подобное, так что это не такая большая проблема)
Есть ли способы, которыми это можно сделать эффективно?
РЕДАКТИРОВАТЬ: ответы до сих пор имеют одну из двух проблем, поэтому я поясню немного. Первая проблема заключается в том, что я не хочу проходить через каждый входной файл более одного раза. Таким образом, наличие цикла для перебора каждой из дат не будет работать. Это потому, что если у меня есть 200 дат и 8000 файлов, это заняло бы 1 600 000 итераций.
Вторая проблема заключается в том, что я хочу разделить каждый из выходных файлов на один файл за дату.
Таким образом, с 200 датами и 8000 файлов должно быть 160000 файлов, но только с 8000 итераций команды поиска.
РЕДАКТИРОВАТЬ 2: вот решение с помощью команд Linux. Я, вероятно, в конечном итоге просто использовать это, если у кого-то нет лучшего способа
grep -f 12/20/2015 12/22/2015 filein1 > intermediate
awk -F, '{print > $1".out"}' intermediate
Это двухэтапный процесс, который сначала фильтрует даты, а затем разбивает результат по дате.