Сократите отобранные данные из файла CSV на 10 ГБ с двумя разделителями

У меня есть файл CSV на 10 ГБ, от которого я пытаюсь сократить избранный объем производства. В данный момент у меня есть следующее, но из-за его размера это потребляет (путь) слишком много ресурсов, таким образом, я надеюсь оптимизировать его.

#!/bin/bash
FILE=data.txt
FILEPATH=/home/user/

if [[ -z $1 ]]; then
        echo "No search parameter specified. Specify one when running this."
fi

echo "Searching $FILEPATH/$FILE for $1.. this may take a while."
echo ""

while IFS= read -r LINE;
        do
                # Grep for $1 and cut select columns
                grep $1 | cut -d"," -f7,9,15,16,19,22,23,24
        done

Типовая линия входного файла смотрит следующим образом:

РЕЗУЛЬТАТЫ: key=value1, error=0, command=SetOperator|SOURCE: файл =/home/user/logs/current, start_date=20130128,

То, что я хотел бы сделать, должно искать файл любую стоимость и иметь его, возвращение (версия сокращения) следует из каждой линии, на которой найден результат.
Например, поиск '20130128' должен возвратиться:

SetOperator, value1,20130128,

Что означает, что я должен буду обращаться и с командой и равняюсь как разделитель.

Я озирался на ТАК (т.е., это) и потраченный на некоторый Google-fu и в то время как я нахожу, общепринятое, что 'читает', медленное и не оптимизированный для больших файлов, таких как они; я не нахожу много альтернатив.

Что вы рекомендовали бы мне использовать?
Спасибо!

1
nl ja de
Я мог, но из-за размера файла это берет> 10 минут, чтобы найти что-либо вообще. Идеально I' d нравится понижать это до <1 минута.
добавлено автор Robert, источник
Я don' t видят, где вы используете переменную ЛИНИИ, объявленную для вашего прочитанного. Единственная вещь, которая будет быстрее, чем хватание файла, состоит в том, чтобы разделить его и выполнить многократные власти, но конечно когда разделение вас должно читать, AMD файла пишут его (который берет еще дольше). Или можно посмотреть на систему that' s разработанный для параллельной обработки как hadoop, но это только поможет если вы сделать это несколько раз. Наконец, вы, если это - продвигаться проект, полагаете, что изменение процесса создает меньшие файлы, которые могут быть параллельны обработанный, не имея необходимость предварительно обрабатывать.Good luck. (Заново продумайте свою проблему;-)
добавлено автор shellter, источник
Ваше узкое место - центральный процессор или ввод/вывод? И какой процесс тот вызывает узкое место, grep или сокращение?
добавлено автор golimar, источник
Могли вы просто grep "$FILEPATH/ "за 1$"; $FILE" | сокращают-d"",-f7,9,15,16,19,22,23,24 ? Никакая потребность образовать петли по линиям в ударе, если я не неправильно понимаю вас...
добавлено автор Jon O., источник

2 ответы

Ваша команда, как написано:

while IFS= read -r LINE;
        do
                # Grep for $1 and cut select columns
                grep $1 | cut -d"," -f7,9,15,16,19,22,23,24
        done

никогда не заканчивался бы, потому что вы не управляете grep НИ НА чем, ни файл, ни труба.

Вместо той петли с grep плюс труба плюс сокращение попробуйте это:

awk -v re="$1" 'BEGIN{FS=OFS=","} $0~re{print $7,$9,$15,$16,$19,$22,$23,$24}' "${FILEPATH}/${FILE}"
1
добавлено

У меня нет файла на 10 ГБ, чтобы проверить на, но grep страница справочника показывают два варианта, которые могут помочь:

- с буфером линии
Используйте линию, буферизующую на продукции. Это может вызвать потерю производительности.

- mmap
Если возможно, используйте mmap (2), системный вызов прочитать вход, вместо дефолта читал (2) системный вызов. В некоторых ситуациях, - урожаи mmap лучшая работа. Однако - mmap может вызвать неопределенное поведение (включая дампы ядра), если входной файл сжимается, в то время как grep работа, или если ошибка ввода/вывода происходит.

Выбор буферизующего линии сделал бы целую команду управляемой медленнее, однако, вы начнете получать более быстрые результаты, mmap может быть странным.

используя те варианты тогда перекручивание было бы uneccessary как указано ниже:

grep --mmap "pattern" file | cut -d"," -f7,9,15,16,19,22,23,24

или

grep --line-buffered "pattern" file | cut -d"," -f7,9,15,16,19,22,23,24
0
добавлено
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.