将大文件拆分为小文件

时间:2017-06-05 20:02:20

标签: bash python-3.x awk

我有一个包含数千个数字值的文本文件 1 2 3 4 五 。 。 。 。 Ñ

我知道我们可以使用awk来分隔这些值。但有没有一种方法可以在不同的文本文件中获取前10,20,40,80,160 ....,n值。

我使用python这样做但是分离这些文件需要花费很多时间。这是python的示例代码

import numpy as np
from itertools import islice
data = np.loadtxt('ABC.txt',
                 unpack=True,
                 delimiter=',',
                 skiprows=1)
n = 10
iterator = list(islice(data[0], n))
for item in range(n):
np.savetxt('output1.txt',iterator,delimiter=',',fmt='%10.5f')

iterator = list(islice(data[0], n*2))
for item in iterator:
np.savetxt('output2.txt', iterator, delimiter=',',fmt='%10.5f')

iterator = list(islice(data[0], n*4))
for item in iterator:
np.savetxt('output3.txt', iterator, delimiter=',',fmt='%10.5f')

iterator = list(islice(data[0], n*8))
for item in iterator:
np.savetxt('output4.txt', iterator, delimiter=',',fmt='%10.5f')

等等。

在bash或python中有更好的方法吗?先感谢您!

3 个答案:

答案 0 :(得分:1)

您没有提供任何样本输入和预期输出,并且您的问题文本含糊不清,所以这只是猜测,但这可能是您正在寻找的内容:

$ seq 1000 | awk -v c=10 'NR==c{print; c=2*c}'
10
20
40
80
160
320
640

如果没有,请编辑您的问题以澄清。

答案 1 :(得分:1)

低效但快速实施apprach

s=5; for i in {1..10}; do ((s*=2)); head -$s file > sub$i; done

由于文件重叠,会有更好的方法,但根据文件的大小和需要重复的次数,这可能已经足够了。

答案 2 :(得分:1)

SED是你的朋友:

$ numlines=$( wc -l big_text_file.txt | cut -d' ' -f1 )

$ step=100

$ echo $numlines
861

$ for (( ii=1; ii<=$numlines; ii+=$step )); do echo $ii,$(( ii+step-1 ))w big_text_file.${ii}.txt; done > break.sed

$ cat break.sed
1,100w big_text_file.1.txt
101,200w big_text_file.101.txt
201,300w big_text_file.201.txt
301,400w big_text_file.301.txt
401,500w big_text_file.401.txt
501,600w big_text_file.501.txt
601,700w big_text_file.601.txt
701,800w big_text_file.701.txt
801,900w big_text_file.801.txt

$ sed -n -f break.sed big_text_file.txt 

$ wc -l big_text_file*.txt
   100 big_text_file.101.txt
   100 big_text_file.1.txt
   100 big_text_file.201.txt
   100 big_text_file.301.txt
   100 big_text_file.401.txt
   100 big_text_file.501.txt
   100 big_text_file.601.txt
   100 big_text_file.701.txt
    61 big_text_file.801.txt
   861 big_text_file.txt
  1722 total