使用循环在不同记录中拆分文件并为文件指定新名称

Kat*_*een 2 sed split

我有一个大文件(800.000 条记录),我想将其拆分为每个包含 20.000 条记录的不同文件。这个我可以做,但我的下一个问题是我想知道是否可以自动生成新文件?

示例:file1 包含 800.000 条记录。首先,我从中取出 20000 条记录并移至另一个文件,然后删除这些\r字符。

sed -n '1,20000p;20001q'  file1 > file1_1
sed -e 's/\r//g' file1_1 > file1
Run Code Online (Sandbox Code Playgroud)

是否可以在循环中做某事?还是我必须写这个40次?

记录数是可变的,今天它包含 800.000 条记录,但明天它可以包含 812.321 条记录中的 789.123 条。我是否必须使用 sed 命令给出一个“结束编号”?

谢谢大家的答案!!

Rom*_*nov 6

您可以尝试使用命令拆分文件split。如果您希望文件中有 20k 条记录,则命令将是:

split -l 20000 file1
Run Code Online (Sandbox Code Playgroud)

如果您想要结果文件的特定前缀,请使用如下命令:

split -l 20000 file1 PREFIX
Run Code Online (Sandbox Code Playgroud)

如果您想要结果文件的数字后缀,请使用如下命令:

split -d -l 20000 file1 PREFIX
Run Code Online (Sandbox Code Playgroud)

这些命令将创建一堆文件,每个文件由 20k 行分割。

要删除,^M您可以使用如下循环:

for i in PREFIX??
do
    dos2unix "$i" "${i}_unix"
done
Run Code Online (Sandbox Code Playgroud)

这将添加_unix到已^M删除的文件的末尾


ter*_*don 5

Romeo Ninov 已经为您提供了正确答案™:使用拆分。但是要回答关于 的一般情况sed,您可以用以下方法做同样的事情:

i=1;
filelen=$(wc -l < file1)
while [[ $i -le $filelen ]]; do 
    sed -n "s/\r//;$i,$((i+19999))p;$(($i+20000))q;" file1 > file1.$i;
    ((i+=20000)); 
done
Run Code Online (Sandbox Code Playgroud)

这将每组 20000 行保存在一个新文件中。如果你真的想做你的问题所显示的并且只保留 1st 20000 行,那就简单多了:

sed -i 's/\r//; 200001q' file
Run Code Online (Sandbox Code Playgroud)