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 <>;'
.