我有一个大文件(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 命令给出一个“结束编号”?
谢谢大家的答案!!
您可以尝试使用命令拆分文件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删除的文件的末尾
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)