3

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

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 ответ1

2

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .