我有一个大的(按行数)纯文本文件,我想把它分成更小的文件,也按行数。因此,如果我的文件有大约2M行,我想把它分成10个包含200k行的文件,或100个包含20k行的文件(加上一个文件;是否能被均匀整除并不重要)。
我可以在Python中相当容易地做到这一点,但我想知道是否有任何一种忍者方法来使用Bash和Unix实用程序(而不是手动循环和计数/分区行)。
我有一个大的(按行数)纯文本文件,我想把它分成更小的文件,也按行数。因此,如果我的文件有大约2M行,我想把它分成10个包含200k行的文件,或100个包含20k行的文件(加上一个文件;是否能被均匀整除并不重要)。
我可以在Python中相当容易地做到这一点,但我想知道是否有任何一种忍者方法来使用Bash和Unix实用程序(而不是手动循环和计数/分区行)。
当前回答
如果你只是想用x行数来分割每个文件,给出的关于分割的答案是可以的。但是,我很好奇为什么没有人关注这些要求:
"without have to count them" ->使用wc + cut "有剩余的额外文件" ->分裂默认情况下
我不能没有“wc + cut”,但我正在使用它:
split -l $(expr `wc $filename | cut -d ' ' -f3` / $chunks) $filename
这可以很容易地添加到你的.bashrc文件函数中,所以你可以调用它,传递文件名和块:
split -l $(expr `wc $1 | cut -d ' ' -f3` / $2) $1
如果您想在额外的文件中只有x个块而没有余数,只需调整公式对每个文件进行求和(chunks - 1)。我确实使用这种方法,因为通常我只想要x个文件数量,而不是每个文件x行:
split -l $(expr `wc $1 | cut -d ' ' -f3` / $2 + `expr $2 - 1`) $1
你可以把它添加到一个脚本,并称之为你的“忍者方式”,因为如果没有适合你的需求,你可以构建它:-)
其他回答
使用split命令:
split -l 200000 mybigfile.txt
这里有一个例子,把文件“toSplit.txt”分成200行小文件“splited00.txt”,splited01.txt,…"splited25.txt"…
split -l 200——numeric-suffix——additional-suffix=".txt
Use:
sed -n '1,100p' filename > output.txt
这里,1和100是您将在output.txt中捕获的行号。
看看split命令:
$ split --help
Usage: split [OPTION] [INPUT [PREFIX]]
Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default
size is 1000 lines, and default PREFIX is `x'. With no INPUT, or when INPUT
is -, read standard input.
Mandatory arguments to long options are mandatory for short options too.
-a, --suffix-length=N use suffixes of length N (default 2)
-b, --bytes=SIZE put SIZE bytes per output file
-C, --line-bytes=SIZE put at most SIZE bytes of lines per output file
-d, --numeric-suffixes use numeric suffixes instead of alphabetic
-l, --lines=NUMBER put NUMBER lines per output file
--verbose print a diagnostic to standard error just
before each output file is opened
--help display this help and exit
--version output version information and exit
你可以这样做:
split -l 200000 filename
它将创建文件,每个文件有200000行,命名为xaa xab xac…
另一个选项,按输出文件的大小分割(仍然在换行符上分割):
split -C 20m --numeric-suffixes input_filename output_prefix
创建类似output_prefix01 output_prefix02 output_prefix03…每个最大大小为20兆字节。
如果你只是想用x行数来分割每个文件,给出的关于分割的答案是可以的。但是,我很好奇为什么没有人关注这些要求:
"without have to count them" ->使用wc + cut "有剩余的额外文件" ->分裂默认情况下
我不能没有“wc + cut”,但我正在使用它:
split -l $(expr `wc $filename | cut -d ' ' -f3` / $chunks) $filename
这可以很容易地添加到你的.bashrc文件函数中,所以你可以调用它,传递文件名和块:
split -l $(expr `wc $1 | cut -d ' ' -f3` / $2) $1
如果您想在额外的文件中只有x个块而没有余数,只需调整公式对每个文件进行求和(chunks - 1)。我确实使用这种方法,因为通常我只想要x个文件数量,而不是每个文件x行:
split -l $(expr `wc $1 | cut -d ' ' -f3` / $2 + `expr $2 - 1`) $1
你可以把它添加到一个脚本,并称之为你的“忍者方式”,因为如果没有适合你的需求,你可以构建它:-)