ループを使用してファイルを複数のレコードに分割し、ファイルに新しい名前を付けます。

ループを使用してファイルを複数のレコードに分割し、ファイルに新しい名前を付けます。

私は大きなファイル(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。ファイルに20,000レコードを含める場合は、コマンドは次のようになります。

split -l 20000 file1

結果ファイルに特定のプレフィックスが必要な場合は、次のコマンドを使用します。

split -l 20000 file1 PREFIX

結果ファイルの数値サフィックスが必要な場合は、次のコマンドを使用します。

split -d -l 20000 file1 PREFIX

このコマンドは、それぞれ20,000行に分割された複数のファイルを生成します。

削除するには^Mループを使用できます。たとえば、次のようになります。

for i in PREFIX??
do
    dos2unix "$i" "${i}_unix"
done

_unix削除されたファイルの末尾に追加されます。^M

答え2

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

これにより、20,000行の各グループが新しいファイルに保存されます。質問に示されているように実行し、最初の20000行だけを維持するのははるかに簡単です。

sed -i 's/\r//; 200001q' file

関連情報