カテゴリに応じてランダムにテキストファイルを半分に分割します。

カテゴリに応じてランダムにテキストファイルを半分に分割します。

次のテキストファイルがあります。

n03250847/n03250847_0.JPEG n03250847
n03250847/n03250847_1.JPEG n03250847
...
n03250847/n03250847_499.JPEG n03250847
...
n03255030/n03255030_0.JPEG n03255030
n03255030/n03255030_1.JPEG n03255030
...
n03255030/n03255030_499.JPEG n03255030

スペースの後の最後の数字はカテゴリ番号です。 200の異なるカテゴリがあり、各カテゴリには500の行(0〜499)があります。このファイルを2つの部分に分割したいと思います。各結果ファイルには100のランダムカテゴリが含まれています。

答え1

カテゴリに応じてファイルを分割し、個々の部分で作業することが気に入らない場合は、次のことを実行できます。

split -l 500 -a 3 infile
rnd=( $(printf %s\\n x??? | shuf -n 100) )
cat "${rnd[@]}" > rand1
rm "${rnd[@]}"
cat x??? > rand2
rm x???

これはsplit、ファイルをそれぞれ500行の200個に分割し(つまり、カテゴリごとに1つ)、shufファイル名を配列に保存してランダムに100個を選択しますrnd。次に、配列にリストされているフラグメントをにマージしてrand1削除し、残りのフラグメントをにマージしてrand2削除します。このソリューションでは、ファイルの行がカテゴリ別にグループ化されており、x???現在のディレクトリで一致する唯一のファイル名は、コマンドによって生成されたファイルsplit名であると想定しています。

関連情報