我有一个简单的 ascii 文本文件,每行都有一个字符串,比如
aa1
aa2
ab1
...
一共N行。我知道我可以使用 split 命令将其拆分为每个文件固定数量的行。如何指定要拆分的文件数,并让拆分决定每个文件有多少行。例如,如果文件有 100 行,我希望能够指定
split 3 foo.txt
它会写出三个文件 xaa xab 和 xac,每个文件有 33、33 和 34 行。这甚至可能吗?还是我为此编写一个自定义 Perl 脚本?
尝试这样做:
split -n 3 file
看
man split | less +/'^\s*-n'
没有选择[*]
您可以使用“wc”来获取行数,然后除以 3,因此它是您想要使用的任何脚本的几行。
([*]更新:在 ubuntu 上有,这就是问题所在。-n 似乎并非所有 linux 或更早版本都存在)。
如果您的拆分实现不接受-n
参数,您可以使用此 bash 函数:
function split_n() { split -l $((($1+`wc -l <"$2"`-1)/$1)) "$2" "${3:-$2.}"; }
您可以将其调用为
split_n 3 file.txt
或者
split_n 3 file.txt prefix
鉴于您的评论是您的 中没有 -n 选项split
,这是您可以采取的一种稍微复杂的方法。
lines=`wc -l < foo.txt`
lines=$((lines/3+1))
split $lines foo.txt
如果您经常这样做,您可以通过获取拆分数量和文件名将其存储在脚本中,如下所示:
splits=$1
filename=$2
lines=`wc -l < $filename`
lines=$((lines/$splits+1))
split $lines $filename