使用循环将文件拆分为不同的记录,并为文件指定新名称

使用循环将文件拆分为不同的记录,并为文件指定新名称

我有一个大文件(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

相关内容