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