Možná to není nejefektivnější způsob, ale funguje to:
shuf <file> > tmp
head -n $m tmp > out1
tail -n +$(( m + 1 )) tmp > out2
S $m obsahující počet řádků.
Tento bash/awk skript vybírá řádky náhodně a zachovává původní sekvenci v obou výstupních souborech.
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
Výstup na základě údajů v otázce.
12345
23456
200
600
========
67891
-20000
20
Stejně jako u všech věcí v Unixu je na to nástroj.
Program dne:split
split rozdělí soubor mnoha různými způsoby, -b bajtů, -l řádků, -n počet výstupních souborů. Budeme používat -l volba. Protože chcete vybrat náhodné řádky a ne jen první m , budeme sort soubor nejprve náhodně. Pokud si chcete přečíst o sort , viz moji odpověď zde.
Nyní skutečný kód. Je to docela jednoduché, opravdu:
sort -R input_file | split -l $m output_prefix
Tím se vytvoří dva soubory, jeden s m řádky a jeden s N-m řádky s názvem output_prefixaa a output_prefixab .Ujistěte se, že m je větší soubor, který chcete, nebo získáte několik souborů o délce m (a jeden s N % m ).
Pokud se chcete ujistit, že používáte správnou velikost, zde je malý kód:
m=10 # size you want one file to be
N=$(wc -l input_file)
m=$(( m > N/2 ? m : N - m ))
sort -R input_file | split -l $m output_prefix
Edit:Všiml jsem si, že nějaký sort implementace nemají -R vlajka. Pokud máte perl , můžete nahradit perl -e 'use List::Util qw/shuffle/; print shuffle <>;' .