我有一个大文件,需要将其分成多个可用的部分。 (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
根据第二列拆分为文件output1
,output2
...
如果要限制每个输出文件的行数:
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