![使用循环将文件拆分为不同的记录,并为文件指定新名称](https://linux22.com/image/147473/%E4%BD%BF%E7%94%A8%E5%BE%AA%E7%8E%AF%E5%B0%86%E6%96%87%E4%BB%B6%E6%8B%86%E5%88%86%E4%B8%BA%E4%B8%8D%E5%90%8C%E7%9A%84%E8%AE%B0%E5%BD%95%EF%BC%8C%E5%B9%B6%E4%B8%BA%E6%96%87%E4%BB%B6%E6%8C%87%E5%AE%9A%E6%96%B0%E5%90%8D%E7%A7%B0.png)
我有一个大文件(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
是否可以在循环中做某事?或者我必须写40遍?
记录数是可变的,今天它包含 800.000 条记录,但明天它可以包含 812.321 条记录中的 789.123 条记录。我必须使用 sed 命令给出“结束编号”吗?
谢谢大家的答案!!
答案1
您可以尝试使用命令拆分文件split
。如果你想在文件中包含 20k 条记录,命令将是:
split -l 20000 file1
如果您想要结果文件的特定前缀,请使用如下命令:
split -l 20000 file1 PREFIX
如果您想要结果文件的数字后缀,请使用如下命令:
split -d -l 20000 file1 PREFIX
这些命令将创建一堆文件,每个文件分为 20k 行。
要删除^M
您可以使用循环,例如:
for i in PREFIX??
do
dos2unix "$i" "${i}_unix"
done
这将添加到已删除的_unix
文件末尾^M
答案2
罗密欧·尼诺夫已经给了你正确答案™: 使用分割。但要回答有关 的一般情况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
这会将每组 20000 行保存在一个新文件中。如果你真的想做你的问题所示的事情并且只保留第一个 20000 行,那么它就简单得多:
sed -i 's/\r//; 200001q' file