将一定数量的行输出到一个新文件,创建一个新的编号文件,直到原始文件为“空”

M. *_*eil 4 bash sed

我有一个看起来像这样的染色体文件:

JH739887 1 30495534
JH739888 1 29527584
JH739889 1 22321128
JH739890 1 19792264
JH739891 1 19033121
JH739892 1 17022292
[...]
Run Code Online (Sandbox Code Playgroud)

可以像这样生成一个测试文件:

cd ~/Desktop/
printf "JH%06d \t 1 \t 100 \n" {1..27239} > test_lotsoflines.txt
Run Code Online (Sandbox Code Playgroud)

它有 27239 行,但我希望有 10 个文件,其中包含 ~2724 行(这将使并行命令工作)。

我可以将原始文件的第 1 行到 2724 行输出到新文件。

sed -n -e '1,2724p' ${REFGENO}/geoFor1.chrom.start.stop.sizes > ~/Desktop/output.txt
wc -l ~/Desktop/output.txt
 2724 ~/Desktop/output.txt
Run Code Online (Sandbox Code Playgroud)

但是现在,我想从第 2725 行增加到 5448,直到到达文件末尾(27239 行)并输出到一个新文件中output##.txt

output01.txt 2724 lines 
output02.txt 2724 lines 
[...]
output10.txt 2723 lines
Run Code Online (Sandbox Code Playgroud)

我正在考虑使用printf "output%02d.txt\n"来获得输出##.txt

但是如何增加文件的编号文件中的行数,最终生成10个文件呢?当然,最后一个文件将有 2723 行,因为原始文件中的行数不是以“0”结尾。

可以使用的一种方法是使用如何在 bash 中增加字符串末尾的数字中提供的解决方案来更新文件名

updateVersion()
{
  [[ $1 =~ ([^0-9]*)([0-9]+) ]] || { echo 'invalid input'; exit; }     
  echo "${BASH_REMATCH[1]}$(( ${BASH_REMATCH[2]} + 1 ))"
}
Run Code Online (Sandbox Code Playgroud)

但是我需要将文件名和扩展名分开......

我在 Mac 上:macOS Mojave 10.14.6。

ste*_*ver 7

这种事情正是 GNU Coreutilssplit函数的设计目的

前任。拆分file为 10 块而不拆分带有前缀output、后缀.txt和递增数字的行

split -d -n l/10 --additional-suffix='.txt' file output
Run Code Online (Sandbox Code Playgroud)