所以我有一个像这样的庞大文件......
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 引用专家,但这与您的示例相匹配并且据报道可以正常工作:
awk -F '[,/]' '{print | "xz -c >" filename$1$2$3".dat.xz"}'