Linux
從數據文件中隨機繪製一定數量的行
我有一個數據列表,比如
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