重叠拆分和合并大文本文件

时间:2015-05-27 09:00:19

标签: perl text awk

我有一个大文件(100 GB +)。 我想并行处理它。我想拆分它,所以第一个文件将包含0到1001 M行,第二个文件从1000 M到2001 M等。 处理文件后,我在每两个结果之间有n条重叠线(n有界但不是常数。让我们假设n可以在100-900 k行之间。重叠只能在行级别发生) 有什么方法可以实现这个任务,还是我必须使用C编写拆分和合并?

2 个答案:

答案 0 :(得分:1)

听起来你正试图重新发明轮子

Map / Reduce,它在Hadoop中的实现是为了“我有一个大文件(100 GB +)而发明的。我想并行处理它。”

自Hadoop发明以来,bigdata工具箱已经有很多新增功能。我建议你看看sparkpython-spark,如果你喜欢C,那么你可能会喜欢python。在我看来,这是非常自然的下一步(如果不是C ++的话)。

否则,通过在输出流附加teehead的流中堆叠tail命令,可以使用bash完成拆分文件。您必须在每个步骤中进行二进制拆分,基本上将每个步骤中的文件减半。命令变得相当复杂,但我之前已经完成了它并且确实有效。只是不要指望你生产的代码可以被其他人理解,它会非常混乱。我建议不要继续这项工作并使用已经过测试和验证的内容,例如Hadoop

答案 1 :(得分:0)

以下是使用awk将文件拆分为重叠块的一种方法:

BEGIN { file_f = -1 }          # initialise file suffix
{ l = NR % 20 }                # 20 is the repeat length
l == 1  { f = 1; file_f += 2 } # f is set for lines 1 to 12, inclusive
l == 13 { f = 0 }
l == 11 { g = 1; file_g +=2 }  # g is set for lines 11 to 2, inclusive
l == 3  { g = 0 }
f { print >"file_"file_f }
g { print >"file_"file_g }

标志f处理"奇数"块和g处理"偶数"那些。每个新块的file_ffile_g后缀加2,导致连续编号的输出文件。

在一个小例子上测试这个(注意awk中的行号从1开始):

$ seq 22 > file
$ awk -f script.awk file
$ cat file_1
1
2
3
4
5
6
7
8
9
10
11
12
$ cat file_2
11
12
13
14
15
16
17
18
19
20
21
22
$ cat file_3
21
22