Разбиение и сжатие файлов в конвейере

Итак, у меня есть массивный файл примерно так...

1/20/2016,somerandomdata
1/20/2016,somerandomdata
1/20/2016,somerandomdata
1/20/2016,somerandomdata
1/21/2016,somerandomdata
1/21/2016,somerandomdata
1/21/2016,somerandomdata
1/21/2016,somerandomdata
1/22/2016,somerandomdata
1/22/2016,somerandomdata
1/22/2016,somerandomdata
1/22/2016,somerandomdata

И я хочу разбить его на несколько файлов меньшего размера на основе первого столбца. Легко: используйте awk вот так:

awk -F '[,/]' '{print > filename$1$2$3".dat"}'

Вот подвох: я хочу, чтобы выходные файлы были сжаты. Итак, я могу пойти дальше и сделать это после факта...

find . -name "filename*.dat" | xargs -l xz

Проблема в том, что я хочу, чтобы xz был в конвейере, а не после разделения данных. Что-то вроде этого:

curl "url" | grep "blah" | xz -c > filename.dat.xz

Конечно, это на самом деле не разбивает файл.

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

Итак, моя цель что-то вроде....

curl "url" | grep "blah" | awk -F '[,/]' '{print > filename$1$2$3".dat"}' | xz -c > filename.dat.xz

Но нет, потому что это, очевидно, не будет работать

Если у вас есть лучшее решение моей проблемы или вы думаете, что я делаю что-то совершенно глупое, я гибок.

1 ответ

Решение

awk может создавать каналы "изначально", как перенаправления в примере. Я не эксперт по цитированию в awk, но это соответствует вашему примеру и, как сообщается, работает A-OK:

awk -F '[,/]' '{print | "xz -c >" filename$1$2$3".dat.xz"}'
Другие вопросы по тегам