如何将一个大的文本文件分割成行数相同的较小的文件?

我有一个很大的(通过行数)纯文本文件,我想分成更小的文件,也是由行数。 所以如果我的文件有大约200万行,我想把它分成10个包含200k行的文件,或者100个包含20k行的文件(加上剩余的一个文件,可以被均匀分割并不重要)。

我可以在Python中很容易地做到这一点,但我想知道是否有任何一种忍者的方式来使用bash和unix utils(而不是手动循环和计数/分割线)。

你看过拆分命令吗?

 $ 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 

这将创build每个200000行命名为xaa xab xac

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

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

创build文件,如output_prefix01 output_prefix02 output_prefix03 ...每个最大大小为20兆字节。

如何拆分命令?

 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. 

使用split

将文件拆分为固定大小的块,创build包含INPUT连续部分的输出文件(如果没有给定或INPUT为“ – ”,则为标准input)

Syntax split [options] [INPUT [PREFIX]]

http://ss64.com/bash/split.html

使用:

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

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

你也可以使用awk

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

如果你只是想通过每个文件的x行分割,关于split的给定asnwers是可以的。 但是,我很好奇没有人注意到提问者的一些要求。

  • “没有必要数它们” – >使用wc + cut
  • “余下的额外文件” – >分裂默认情况下

我目前使用的是:

 split -l $(expr `wc $filename | cut -d ' ' -f3` / $chunks) $filename 

这可以很容易地添加到你的bashrc函数,所以你可以调用它传递文件名和块:

  split -l $(expr `wc $1 | cut -d ' ' -f3` / $2) $1 

如果你只需要在额外的文件中没有剩余的x块,只需调整公式就可以在每个文件上对其进行求和(块-1)。 我使用这种方法,因为通常我只想要x个文件而不是每个文件x行:

 split -l $(expr `wc $1 | cut -d ' ' -f3` / $2 + `expr $2 - 1`) $1 

你可以把它添加到脚本中,并称之为“忍者之路”,因为如果没有任何东西满足你的需求,你可以构build它:-)

HDFS getmerge小文件,并溢出到属性的大小。

这种方法会导致换行

拆分-b 125m compact.file -d -a 3 compact_prefix

我试图让每个文件分成大约128MB。

拆分为128m,判断尺寸单位是M还是G,请在使用前testing。

 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 number suffix. ref http://blog.csdn.net/microzone/article/details/52839598 compact_file_name=$compact_file"_" echo "compact_file_name :"$compact_file_name split -nl/$res $basedir/$compact_file -d -a 3 $basedir/${compact_file_name}