Bash管道和Shell扩展

时间:2015-10-04 12:08:31

标签: bash shell

我已将bash管道中的数据源从cat ${file}更改为cat file_${part_number},因为预处理导致${file}被截断为2GB,拆分输出消除了预处理问题。然而,在测试此更改时,我无法确定如何让Bash继续对我用于测试管道的一些基本操作采取相同的操作。

我原来的管道是:

cat giantfile.json | jq -c '.' | python postprocessor.py

使用原始管道,如果我正在测试对postprocessor.py或预处理器的更改,并且我想使用giantfile.json中的几个项目测试我的更改,我可以使用{{1} }和head。像这样:

tail

修复预处理器问题的新管道:

cat giantfile.json | head -n 2 - | jq -c '.' | python postprocessor.py
cat giantfile.json | tail -n 3 - | jq -c '.' | python postprocessor.py

这很好用,因为每个文件最终都会输出。但是我不想每次测试等待5-10分钟。我尝试用前两行输入来测试。

cat file_*.json | jq -c '.' | python postprocessor.py

Bash坐在那里的工作时间比应该的长,所以我试试:

cat file_*.json | head -n 2 - | jq -c '.' | python postprocessor.py

我的问题很清楚。 Bash正在输出所有文件的内容,好像头部甚至没有,因为每个文件现在都有1行数据。我以前从未需要用bash这样做,而且我很沮丧。

为什么 Bash会以这种方式运行,而 如何 我会将我的小bash命令管道改写为工作它以前的方式,允许我选择第一个/最后 n 数据行来进行测试?

1 个答案:

答案 0 :(得分:2)

我的猜测是,当你将json分成单个文件时,你设法从每行的末尾删除换行符,结果是连接文件(cat file_json.*)实际上只有一行总的来说,因为cat不会在它连接的文件之间插入换行符。

如果文件实际上是一行,每行都有一个终止换行符,那么通过head -n 2管道就可以了。

您可以使用wc检查此假设,因为该实用程序会计算换行符而不是行。如果它报告文件有0行,那么您需要修复预处理。