Grep несколько строк и вывод в несколько файлов - PullRequest
0 голосов
/ 16 декабря 2018

Я нашел здесь вопросы о подборе нескольких строк и вопросы о выводе в несколько файлов, но мне кажется, что я не могу найти ничего о том, чтобы делать оба одновременно.

У меня есть файл объемом 300 ГБ, который мне нуженсделать регулярное выражение grep для около 1200 строк.Я пытаюсь выполнить поиск файла один раз, чтобы он не проходил по нему 1200 раз.

Вот пример того, что я сейчас делаю 1200 раз:

grep -hi "^1wh" /system/data/DATAFILE.txt > /system/tables/wh.csv
grep -hi "^1wi" /system/data/DATAFILE.txt > /system/tables/wi.csv
grep -hi "^1wj" /system/data/DATAFILE.txt > /system/tables/wj.csv
grep -hi "^1wk" /system/data/DATAFILE.txt > /system/tables/wk.csv
grep -hi "^1al" /system/data/DATAFILE.txt > /system/tables/al.csv
grep -hi "^1am" /system/data/DATAFILE.txt > /system/tables/am.csv
grep -hi "^1an" /system/data/DATAFILE.txt > /system/tables/an.csv

Имя выходного файла совпадает с искомой строкой, которую нужно найти, - без номера 1. Впереди.

Есть ли способ выполнить grep файл один раз для нескольких строк и вывести результаты каждой строки вразные файлы, поэтому мне не нужно запускать grep 1200 раз?

1 Ответ

0 голосов
/ 16 декабря 2018

Согласитесь с комментатором, что это кажется невозможным с grep.

Как насчет чего-то вроде следующего, который перебирает регулярные выражения для генерации программы awk, которая добавляет каждую строкуфайла данных в соответствующий выходной файл:

#!/usr/bin/env bash

mkdir -p output
rm -f output/*
rm -f pattern.awk

readarray -t patterns < patterns

echo "BEGIN{IGNORECASE=1}" > pattern.awk

for pattern in "${patterns[@]}"; do
    echo "/$pattern/{print \$0 >> \"output/$pattern\"}" >> pattern.awk
done

awk -f pattern.awk data

Результат:

$ cat data
1Abfoo
1whfoo
1wifoo
1wjfoo
43hfoo
1wkfoo
1abfoo


$ cat patterns
^1wh
^1wi
^1wj
^1wk
^1ab

$ ./parse.sh

$ head output/*
==> output/^1ab <==
1Abfoo
1abfoo

==> output/^1wh <==
1whfoo

==> output/^1wi <==
1wifoo

==> output/^1wj <==
1wjfoo

==> output/^1wk <==
1wkfoo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...