如何将一个大的文本文件分割成具有相等行数的小文件?

我有一个大的(按行数)纯文本文件,我想把它分成更小的文件,也按行数。因此,如果我的文件有大约2M行,我想把它分成10个包含200k行的文件,或100个包含20k行的文件(加上一个文件;是否能被均匀整除并不重要)。

我可以在Python中相当容易地做到这一点,但我想知道是否有任何一种忍者方法来使用Bash和Unix实用程序(而不是手动循环和计数/分区行)。

634641 次浏览

看看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

它将创建一个文件,每个文件有20万行,名为xaa xab xac

另一个选项,按输出文件的大小分割(仍然在换行符上分割):

 split -C 20m --numeric-suffixes input_filename output_prefix

创建像output_prefix01 output_prefix02 output_prefix03 ...这样的文件,每个最大大小为20兆字节。

使用# EYZ1:

将文件分割为固定大小的片段,创建包含连续INPUT部分的输出文件(如果没有给定或INPUT为' -'则为标准输入)

# EYZ0

使用分裂命令:

split -l 200000 mybigfile.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 just before each
output file is opened
--help     display this help and exit
--version  output version information and exit


SIZE may have a multiplier suffix:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.

你也可以使用AWK:

awk -vc=1 'NR%200000==0{++c}{print $0 > c".txt"}' largefile

使用:

sed -n '1,100p' filename > output.txt

这里,1和100是您将在output.txt中捕获的行号。

如果你只是想把每个文件分割成x行数,给出的关于split的答案是可以的。但是,我很好奇为什么没有人关注这些要求:

  • “不用数”;→使用wc + cut
  • “以额外文件形式填写其余内容”;→默认情况下是Split

没有“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

你可以把它添加到一个脚本中,并称之为你的“忍者方式”,因为如果没有适合你的需求,你可以构建它:-)

HDFS getmerge小文件并分割成合适的大小。

这个方法会导致换行:

split -b 125m compact.file -d -a 3 compact_prefix

我尝试为每个文件getmerge和分割成大约128 MB。

# Split into 128 MB, and judge sizeunit is M or G. Please test before use.


begainsize=`hdfs dfs -du -s -h /externaldata/$table_name/$date/ | awk '{ print $1}' `
sizeunit=`hdfs dfs -du -s -h /externaldata/$table_name/$date/ | awk '{ print $2}' `
if [ $sizeunit = "G" ];then
res=$(printf "%.f" `echo "scale=5;$begainsize*8 "|bc`)
else
res=$(printf "%.f" `echo "scale=5;$begainsize/128 "|bc`)  # Celling ref http://blog.csdn.net/naiveloafer/article/details/8783518
fi
echo $res
# Split into $res files with a number suffix. Ref:  http://blog.csdn.net/microzone/article/details/52839598
compact_file_name=$compact_file"_"
echo "compact_file_name: "$compact_file_name
split -n l/$res $basedir/$compact_file -d -a 3 $basedir/${compact_file_name}

拆分文件“file.txt”;转换成10,000行文件:

split -l 10000 file.txt

split(来自GNU coreutils,因为版本8.8从2010-12-22)包含以下参数:

-n, --number=CHUNKS     generate CHUNKS output files; see explanation below


CHUNKS may be:
N       split into N files based on size of input
K/N     output Kth of N to stdout
l/N     split into N files without splitting lines/records
l/K/N   output Kth of N to stdout without splitting lines/records
r/N     like 'l' but use round robin distribution
r/K/N   likewise but only output Kth of N to stdout

因此,split -n 4 input output.将生成四个具有相同字节数的文件(output.a{a,b,c,d}),但行可能在中间断开。

如果我们想保留完整的行(即按行分割),那么这应该是有效的:

split -n l/4 input output.

相关答案:https://stackoverflow.com/a/19031247

将一个大的文本文件分成1000行的小文件:

# EYZ0

使用实例将一个较大的二进制文件分割为多个10M大小的小文件。

# EYZ0

将多个文件合并为一个文件:

# EYZ0

拆分一个文件,每个拆分有10行(除了最后一个拆分):

# EYZ0

将一个文件拆分为5个文件。文件被分割,使得每个分割都有相同的大小(除了最后一个分割):

# EYZ0

每次分割一个512字节的文件(除了最后一次分割;千字节使用512k,兆字节使用512m):

# EYZ0

拆分文件,每次拆分最多512字节,不断行:

# EYZ0