次のテキストファイルがあります。
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
名であると想定しています。