Linux

從數據文件中隨機繪製一定數量的行

  • October 1, 2018

我有一個數據列表,比如

12345
23456
67891
-20000
200
600
20
...

假設這個數據集(即文件行)的大小是N. 我想m從這個數據文件中隨機畫線。因此,輸出應該是兩個文件,一個是包含這m幾行數據的文件,另一個是包含這幾行數據的文件N-m

有沒有辦法使用 Linux 命令來做到這一點?

這可能不是最有效的方法,但它有效:

shuf <file> > tmp
head -n $m tmp > out1
tail -n +$(( m + 1 )) tmp > out2

$m包含的行數。

此 bash/awk 腳本隨機選擇行,並在兩個輸出文件中保持原始順序。

awk -v m=4 -v N=$(wc -l <file) -v out1=/tmp/out1 -v out2=/tmp/out2 \
'BEGIN{ srand()
        do{ lnb = 1 + int(rand()*N)
            if ( !(lnb in R) ) {
                R[lnb] = 1
                ct++ }
        } while (ct<m)
 } { if (R[NR]==1) print > out1 
     else          print > out2       
 }' file
cat /tmp/out1
echo ========
cat /tmp/out2

輸出,基於問題中的數據。

12345
23456
200
600
========
67891
-20000
20

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