我在一个文件夹中有数亿个小的纯文本文件.我想将它们合并到一个大文件中并进行一些处理.最快的方法是什么?目前,我有以下代码:
#!/bin/bash
FOLDER="some-folder"
TARGET="target-file"
FILES=`find $FOLDER -name "*.txt"`
for f in $FILES
do
cat $f | ./some-processing-script.pl >> $TARGET
done
Run Code Online (Sandbox Code Playgroud)
虽然这适用于少量文件.当它实际用于处理大量文件时,在目标文件大于25G左右后变得非常慢.我认为是因为cat ... >> $TARGET在将新内容附加到目标末尾之前必须扫描每个新输入文件的整个当前目标文件.
我知道如何使用java或python来解决这个问题.我很好奇我是否能在bash中解决这个问题.谢谢.
您可以改为重定向循环的输出:
for f in $FILES
do
./some-processing-script.pl < $f
done >> $TARGET
Run Code Online (Sandbox Code Playgroud)
(我也消除了无用的猫.)