【发布时间】:2012-09-03 11:52:49
【问题描述】:
我有一个包含 10 百行,长度不同的文本文件。现在我想随机选择N行,保存在另一个文件中,然后从原始文件中删除。 我已经找到了这个问题的一些答案,但大多数都使用了一个简单的想法:对文件进行排序并选择第一行或最后 N 行。不幸的是,这个想法对我不起作用,因为我想保留行的顺序。 我试过这段代码,但速度很慢,需要几个小时。
FILEsrc=$1;
FILEtrg=$2;
MaxLines=$3;
let LineIndex=1;
while [ "$LineIndex" -le "$MaxLines" ]
do
# count number of lines
NUM=$(wc -l $FILEsrc | sed 's/[ \r\t].*$//g');
let X=(${RANDOM} % ${NUM} + 1);
echo $X;
sed -n ${X}p ${FILEsrc}>>$FILEtrg; #write selected line into target file
sed -i -e ${X}d ${FILEsrc}; #remove selected line from source file
LineIndex=`expr $LineIndex + 1`;
done
我发现这行代码中最耗时的一行:
sed -i -e ${X}d ${FILEsrc};
有什么办法可以解决这个问题,让代码更快? 既然我很着急,请问您可以发给我完整的 c/c++ 代码吗?
【问题讨论】:
-
这可以在真正的编程语言中非常快地完成,而不仅仅是一个 shell。
-
“快速方法”包括将适当的内容读入内存、操作和一次写入或读取行偏移量、执行增量计算和一次写入......两者在其他环境中都简单得多,而且两者都充分利用一次写作。
-
@dystroy:定义“真正的编程语言”。
-
@phresnel 任何足够完整的语言,以便您可以使用标准 API 而不是寻找黑客和您计算机上可能拥有的所有实用程序(sed、awk 等)的选项。两种方法都有效,但一种方法是在可预测的开发和执行时间内完成。不要误会:我对在 shell 上执行此操作的巧妙方法很感兴趣,但我只是说键入 30 行编程语言可能更容易、更有效。
-
@dystroy 这有点愚蠢——sed、awk 和其他以这种方式使用的工具本身可以被视为 API,只要有定义的公开接口(和“标准”对于许多 Linux 发行版)。并且 API 可以被指定为要求.. 当然我同意使用 perl 或 ruby 或 python 可能会更容易(所有这些都是一个“可能在 [他们的] 计算机上拥有的程序” )。
标签: linux bash text random sed