Command-Line
如何隨機採樣文件的子集
是否有任何 Linux 命令可以用來對文件的子集進行採樣?例如,一個文件包含一百萬行,而我們只想從該文件中隨機抽取一千行。
對於隨機,我的意思是每條線都有相同的機率被選擇,並且選擇的線都不是重複的。
head
並且tail
可以選擇文件的一個子集,但不能隨機選擇。我知道我總是可以編寫一個 python 腳本來做到這一點,但只是想知道是否有這種用法的命令。
該
shuf
命令(coreutils 的一部分)可以執行以下操作:shuf -n 1000 file
並且至少現在非古代版本(在2013 的送出中添加),將在適當的時候使用水庫採樣,這意味著它不應該耗盡記憶體並且使用快速算法。
如果您有一個非常大的文件(這是採樣的常見原因),您會發現:
shuf
耗盡記憶體- 如果文件超過 32767 行,使用
$RANDOM
將無法正常工作如果您不需要“完全”n 採樣行,您可以採樣如下比率:
cat input.txt | awk 'BEGIN {srand()} !/^$/ { if (rand() <= .01) print $0}' > sample.txt
這使用常量記憶體,對文件的 1% 進行採樣(如果您知道文件的行數,您可以調整此因子以採樣接近有限的行數),並且適用於任何大小的文件,但它不會返回精確的行數,只是一個統計比率。