Command-Line

如何隨機採樣文件的子集

  • December 1, 2020

是否有任何 Linux 命令可以用來對文件的子集進行採樣?例如,一個文件包含一百萬行,而我們只想從該文件中隨機抽取一千行。

對於隨機,我的意思是每條線都有相同的機率被選擇,並且選擇的線都不是重複的。

head並且tail可以選擇文件的一個子集,但不能隨機選擇。我知道我總是可以編寫一個 python 腳本來做到這一點,但只是想知道是否有這種用法的命令。

shuf命令(coreutils 的一部分)可以執行以下操作:

shuf -n 1000 file

並且至少現在非古代版本(在2013 的送出中添加),將在適當的時候使用水庫採樣,這意味著它不應該耗盡記憶體並且使用快速算法。

如果您有一個非常大的文件(這是採樣的常見原因),您會發現:

  1. shuf耗盡記憶體
  2. 如果文件超過 32767 行,使用$RANDOM將無法正常工作

如果您不需要“完全”n 採樣行,您可以採樣如下比率

cat input.txt | awk 'BEGIN {srand()} !/^$/ { if (rand() <= .01) print $0}' > sample.txt

使用常量記憶體,對文件的 1% 進行採樣(如果您知道文件的行數,您可以調整此因子以採樣接近有限的行數),並且適用於任何大小的文件,但它不會返回精確的行數,只是一個統計比率。

注意:程式碼來自:https ://stackoverflow.com/questions/692312/randomly-pick-lines-from-a-file-without-slurping-it-with-unix

引用自:https://unix.stackexchange.com/questions/108581