mac unix脚本问题

时间:2010-02-19 06:58:15

标签: unix scripting awk

我正在尝试编写一个脚本,将一个非常大的文件分解成更小的片段,然后发送到在后台运行的脚本。动机是如果脚本在后台运行,我可以并行运行。

这是我的代码,。/ 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语句是停止脚本的原因。我无法弄清楚出了什么问题。

3 个答案:

答案 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