如何根据文本列中的值将大文件拆分为多个较小的文件?

如何根据文本列中的值将大文件拆分为多个较小的文件?

我有一个大文件,需要将其分成多个可用的部分。 (3.5亿条记录)关键是第二列值不能溢出到下一个文件中。

读写占用时间太长,split命令不起作用。我还能做些什么吗?

包含 10 条记录的示例文件将被拆分为 3 个输出文件:

aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,24,xxx

输出1:

aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx

输出2:

aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx

输出3:

aa,24,xxx

答案1

awk

awk -F, '$2 != ref { i++; ref = $2 } { print $0 >"output" i }' input

input根据第二列拆分为文件output1output2...

如果要限制每个输出文件的行数:

awk -F, '$2 != ref { i++; ref = $2; lines = 0 } lines >= 1000 { i++; lines = 0 } { print $0 >"output" i; lines++ }' input

将生成最多包含 1000 行的输出文件,尊重第二列的约束。

这是另一个变体,它在达到给定限制(本例中为 1000 行,您可能会使用 50000000 行)后在第二列中的下一个更改处进行拆分:

awk -F, 'BEGIN { change = 1 } change && $2 != ref { i++; ref = $2; change = 0; lines = 0 } lines >= 1000 { change = 1 } { print $0 >"output" i; lines++; ref = $2 }' input

答案2

使用磨坊主

$ mlr --nidx --fs comma put -q 'tee > $2 . ".dat", $*' ten.dat

$ cat 22.dat
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx

$ cat 23.dat
aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx

$ cat 24.dat
aa,24,xxx

相关内容