<< 2020.8 >>
[Stories]
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

コネタ/テキストファイルを適当に間引く

はじめに

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

  • SUMOで死ぬほど車を走らせたがQGISで全部表示するの無理
  • よく分かんないけど、N行毎に抽出するとデータが偏ってしまう何か

答えの例

概ね 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 に間引く例です

  • 入力ファイルの各行の頭に 000 - 999 の文字列を /dev/urandom を使ってランダムに割り振る
  • sed で先頭が 000 の行だけ抽出する
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