はじめに

大量のテキストデータ(csvとかとか)をランダムに間引きたい時ってありますよね?

答えの例

概ね 1/N にランダムに絞りたいときはこうするのが手っ取り早いです

cat "テキストファイル名"  | perl -ne 'print if !int(rand N)' >"出力ファイル名"

軽く試してみるとこんな感じです

# 1から10,000までの連番を、概ね1/1,000 に間引く
$ seq 10000 | perl -ne 'print if !int(rand 1000)' | nl
     1	535
     2	1211
     3	1320
     4	1806
     5	3102
     6	4458
     7	5034
     8	5256
     9	5959
    10	6208
    11	6575
    12	7511
    13	9169
    14	9940

別解の例

/dev/urandom を使って概ね 1/1000 に間引く例です

tr -dc '0-9' </dev/urandom | fold -w3 | head -n $(wc -l <入力ファイル名) | paste -d, - 入力ファイル名 | sed -n '/^000/{s/^....//;p}'

100,000 までのファイルを作り抽出した例です
Macなので tr の前に LANG=C がついてたり、sed -> gsed とか変ですが気にしないで雰囲気だけ掴んで下さい

$  seq 100000 >/tmp/dummy.txt

$ LANG=C tr -dc '0-9' </dev/urandom | fold -w3 | head -n$(wc -l </tmp/dummy.txt) | paste -d, - /tmp/dummy.txt | gsed -n '/^000/{s/^....//;p}' | nl
     1  928
(略)
    88  98956

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-07-30 (木) 00:53:25