我有一个文件(当前约为 1 GB,40M 行),我需要根据目标文件大小(目标为每个文件约 1 MB)将其拆分为较小的文件。
该文件包含多行制表符分隔值。第一列有一个整数值。文件按第一列排序。第一列中有大约 1M 个值,因此每个值平均有 40 行,但有些值可能有 2 行,其他可能有 100 行或更多行。
12\t...
12\t...
13\t...
14\t...
15\t...
15\t...
15\t...
16\t...
...
2584765\t...
2586225\t...
2586225\t...
分割文件后,任何不同的第一个值只能出现在单个文件中。例如。当我读取一个较小的文件并找到以 15
开头的行时,可以保证没有其他文件包含以 15
开头的行。
这不意味着将以特定值开头的所有行映射到单个文件。
这可以通过 Unix/Linux 系统上可用的命令行工具实现吗?
下面将尝试每 40,000 条记录进行拆分,但如果下一条记录与前一条记录具有相同的键,则推迟拆分。
awk -F '\t' 'BEGIN { i=1; s=0; f=sprintf("file%05i", i) }
NR % 40000 == 0 { s=1 }
s==1 && $1!=k { close(f); f=sprintf("file%05i", ++i); s=0 }
{ k=$1; print >>f }' input
我是一名优秀的程序员,十分优秀!