divisão de arquivos e compactação em pipeline

3

Então eu tenho um arquivo enorme algo assim ...

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

E eu quero dividi-lo em um monte de arquivos menores com base na primeira coluna. Fácil: use o awk assim:

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

Aqui está o problema: eu quero que os arquivos de saída sejam compactados. Então, eu poderia ir em frente e fazer isso depois do fato ...

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

O problema é que eu quero que o xz esteja no pipeline em vez de depois que os dados sejam divididos. Algo parecido com isto:

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

Claro, isso não divide o arquivo.

A razão pela qual eu quero isso no pipeline é porque estou baixando os dados e quero executar a compactação ao mesmo tempo que o download, em vez de depois. (Tenho certeza que isso faria as coisas irem mais rápido, mas se eu estiver errado, corrija-me)

Então, meu objetivo é algo como ....

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

Mas não, porque obviamente isso não funcionará

Se você tiver uma solução melhor para o meu problema ou se achar que estou fazendo algo completamente estúpido, sou flexível.

    
por Jay 23.01.2016 / 09:35

1 resposta

2

awk pode fazer pipes "nativamente", assim como os redirecionamentos no exemplo. Eu não sou um especialista em citar awk, mas isso corresponde ao seu exemplo & é relatado para trabalhar A-OK:

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