GNU/Linux >> Znalost Linux >  >> Linux

Náhodně nakreslete určitý počet řádků z datového souboru

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


Linux
  1. Najděte počet řádků kódu z úložiště GitHub

  2. Rozdělit soubor podle počtu řádků včetně záhlaví v každém z nich?

  3. Počet řádků vydaných Ls?

  1. Jak získat pouze počet řádků souboru

  2. Odstraňte liché nebo sudé řádky z textového souboru

  3. Odstraňte prvních N řádků z aktivního souboru protokolu

  1. Efektivně odstranit prvních pár řádků z textového souboru?

  2. extrahujte řádky zdola, dokud se regulární výraz neshoduje

  3. Jak zobrazit určité řádky z textového souboru v Linuxu?