Perl 大型文本文件的重叠拆分和合并

Perl 大型文本文件的重叠拆分和合并,perl,text,awk,Perl,Text,Awk,我有一个大文件(100GB+)。 我想并行处理它。我想拆分它,这样第一个文件将包含第0到1001行,第二个文件将包含第1000到2001行,等等。 处理完文件后,两个结果之间有n条重叠线(n是有界的,但不是常数。假设n可以在100-900 k行之间。重叠只能发生在行级别) 有什么方法可以完成这个任务吗?或者我必须用C编写拆分和合并程序吗?听起来你好像在试图重新发明轮子 Map/Reduce及其在中的实现就是为了“我有一个大文件(100GB+),我想并行处理它。” 自从Hadoop发明以来,big

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

听起来你好像在试图重新发明轮子

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

自从Hadoop发明以来,bigdata工具箱中增加了很多东西。我建议您研究一下,如果您喜欢C,那么您可能会喜欢python。在我看来,这是非常自然的下一步(如果不是C++)。
否则,可以使用bash通过将命令堆叠在流中并附加到输出流来完成文件拆分。您必须在每个步骤中进行二进制分割,基本上在每个步骤中将文件减半。这个命令变得相当复杂,但我以前做过,它确实有效。只是不要期望您生成的代码被其他人理解,它会变得非常混乱。我建议不要使用这类工作,而应该使用已经过测试和验证的工具,例如

这里有一种方法可以使用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_f
file_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