如何在 Linux 中根据不同的行数分割文件

如何在 Linux 中根据不同的行数分割文件

我想将文件拆分成相等的部分,最后一个文件获取 Unix 中的剩余记录。例如:文件有 4 行,我想拆分成 4 个文件 = 太棒了。每个文件 1 行。

我有 5 行,我想将其拆分成 4 个文件。我真正想要的是:

File - number of lines;
f1 - 1;
f2 - 1;
f3 - 1;
f4 - 2;

这在 Unix 中是否可以通过直接 split 命令实现?我认为如果不对 split 进行一些额外的迭代编码,这是不可能的?

这是我尝试过的:

numsplitfile=$parm (lets say 4)
total_lines=$(wc -l < $inputfile) (lets say the file has 5 lines)
lines_per_file = (total_lines + numsplitfile - 1) / numsplitfile)
split -l $lines_per_file $inputfile splitfilename

这样做的目的是将其转换为:

split -l 2 $inputfile splitfilename

因此我得到了 3 个文件,每个文件有 2、2、1 行。但我想要的是 4 个文件中的 1、1、1、2 行。

答案1

看起来您无法仅使用 split 命令来执行此操作,但您可以解决这个问题。
尝试以下操作:

#!/bin/bash
inputfile=$1
parts=$2
total_lines=$(wc -l < "$inputfile")
lines_per_file=$[$total_lines / $parts]

rm out*  2>/dev/null
split -d -l $lines_per_file "$inputfile" out

extra_files=$(printf "out%02i\n" `seq $parts $[$parts * 2 - 1]`)
last_file=$(printf "out%02i\n" $[$parts - 1])
cat $extra_files >> $last_file   2>/dev/null  # ignore errors
rm  $extra_files                 2>/dev/null  # ignore errors

命名它split_file然后你可以像这样调用它:

$ ./split_file input_file 4

分割文件将被称为out00 out01 out02等等...

相关内容