我已将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 数据行来进行测试?
答案 0 :(得分:2)
我的猜测是,当你将json分成单个文件时,你设法从每行的末尾删除换行符,结果是连接文件(cat file_json.*
)实际上只有一行总的来说,因为cat
不会在它连接的文件之间插入换行符。
如果文件实际上是一行,每行都有一个终止换行符,那么通过head -n 2
管道就可以了。
您可以使用wc
检查此假设,因为该实用程序会计算换行符而不是行。如果它报告文件有0行,那么您需要修复预处理。