我正在尝试编写一个脚本,将一个非常大的文件分解成更小的片段,然后发送到在后台运行的脚本。动机是如果脚本在后台运行,我可以并行运行。
这是我的代码,。/ seq就像普通的seq命令(mac没有)一样。 $ 1是要拆分的大文件。
echo "Splitting and Running Script"
for i in $(./seq 0 14000000 500000)
do
awk ' { if (NR>='$i' && NR<'$(($i+500000))') { print $0 > "xPart'$i'" } }' $1
python FastQ2Seq.py xPart$i &
done
wait
echo "Concatenating"
for k in *.out.seq
do
cat $k >> original.seq
done
for j in *.out.qul
do
cat $j >> original.qul
done
echo "Cleaning"
rm xPart*
我的问题是只有xPart0,并且在程序挂起之前它只有499995行。我在脚本中放了一些调试回声,我知道awk语句是停止脚本的原因。我无法弄清楚出了什么问题。
答案 0 :(得分:1)
查看split命令 -
split -- split a file into pieces Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000 lines, and default PREFIX is `x'. With no INPUT, or when INPUT is -, read standard input.
应该比在循环中运行awk更快,更可靠,更清洁!
答案 1 :(得分:0)
echo "Splitting and Running Script"
# splits to smaller files each 50000 lines, if i understand your problem correctly
awk 'NR%50000==1{++c}{print $0 > "xPart"c".txt"}' file
# or use split -l 50000
for file in xPart*
do
python FastQ2Seq.py "$file" &
done
echo "Concatenating"
cat *.out.seq >> original.seq
cat *.out.qul >> original.qul
答案 2 :(得分:0)
如果你的seq真的像标准seq一样工作,你就错了。 seq的正确命令行是:
seq FIRST INCREMENT LAST
因此您需要将seq命令行更改为:
seq 0 500000 14000000