Разбиение и сжатие файлов в конвейере
Итак, у меня есть массивный файл примерно так...
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"}'