ディレクトリ内の各ファイルからn行のランダムサンプルを選択する方法

ディレクトリ内の各ファイルからn行のランダムサンプルを選択する方法

多くのファイルを含むディレクトリがあります。各ファイルからランダムサンプルをインポートし、ランダムサンプルをインポートしたファイルと同じファイル名を持つ新しいディレクトリにコピーしたいと思います。

ベストアンサー1

mkdir -p random_samples
find dir -type f -exec sh -c 'for n do sort -R "$n" | head >"random_samples/${n##*/}"; done' sh {} +

その後、その中またはその下にあるすべての一般的なファイルを見つけ、それに対してdir短いシェルスクリプトを実行します。

for n do
    sort -R "$n" | head >"random_samples/${n##*/}"
done

この短いシェルスクリプトは、指定されたパス名(で見つかった通常のファイルfind)を繰り返し、sort -R各パス名で実行されます。これにより、行が混在してhead毎回混在する最初の10行が生成されます。出力は、random_samples元のファイルと同じファイル名を持つディレクトリに移動されます。ファイル名の競合は解決されませんrandom_samples

sort -R代わりにGNU coreutilsを使用することもできますshuf

唯一の欠点は、ランダムサンプルのライン順序がランダムであることです。つまり、ランダムなサンプルの行はファイルの元の順序に従ってソートされません。

元のファイルと同じように、ランダムサンプルに対して同じソートを実行するために、短いシェルスクリプトを次のように置き換えることができます。

for n do
    awk -v OFS="\t" "{ print NR, \$0 }" "$n" | sort -R | head | sort -n |
    cut -f 2 >"random_samples/${n##*/}"
done

まず、ファイルの各行に行番号(およびタブ)を追加してから、行を混ぜて前のように最初の10行を選択します。次に、選択した行を数字でソートし、サンプルを保存する前に行番号を削除します。

次の実行を許可しますfind

find dir -type f -exec sh -c '
    for n do
        awk -v OFS="\t" "{ print NR, \$0 }" "$n" | sort -R | head | sort -n |
        cut -f 2 >"random_samples/${n##*/}"
    done' sh {} +

10個より多いまたは少ない行を選択するには、選択したい行数のhead位置head -n NUMを変更します。NUM

おすすめ記事