さまざまな長さの数百行を含むテキストファイルがあります。ここで、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++コードを送ってください。