
次の形式のファイルがあります。
train/t/temple/east_asia/00000025.jpg 94
train/t/temple/east_asia/00000865.jpg 94
...
train/s/swamp/00000560.jpg 92
train/s/swamp/00000935.jpg 92
....
train/m/mountain/00000428.jpg 68
train/m/mountain/00000126.jpg 68
最後の数字は学番です。それぞれ1,000行の50の異なるクラスがあります。各クラスからサイズNのサンプルをランダムに抽出し、結果を別のテキストファイルに保存したいと思います。
答え1
行はクラス別にグループ化されているので、(gnu
ツールを使用して)split
ファイルを複数の部分に分割し、--fiter
オプションを使用して各部分をパイプすることができますshuf
。窒素その中のランダムな行:
分割 --filter='shuf -n窒素'内部ファイル>外部ファイル
デフォルトsplit
は1000行です。これはこの特別な場合に必要なものです。要件が変更されたら、行数を渡す必要があります。たとえば、-l
これを200行に分割し、各行からランダムに30行をインポートする必要があります。
split -l 200 --filter='shuf -n 30' infile > outfile
答え2
awk
これを行うには、コマンドを一度だけ呼び出すだけです。
n = 1000行ごとにp = 50行をランダムに選択します。
awk -v n=1000 -v p=50 '
BEGIN {srand(); remaining = p}
NR > n {remaining = p; NR = 1}
rand()*(n + 1 - NR) < remaining {
print; remaining--
}' < your-file