Como subconjunto aleatoriamente um arquivo e, em seguida, selecione os mesmos números de linha de vários arquivos

1

Eu tenho um arquivo que contém 3494 linhas, das quais eu gostaria de selecionar aleatoriamente 100, e escrever essas linhas para um novo arquivo. Eu posso fazer isso usando isso:

shuf -n 100 input_file.txt output_file.txt

No entanto, tenho muitos desses arquivos de entrada e gostaria de selecionar as mesmas 100 linhas de cada arquivo. Ou seja, preciso manter os índices de linha escolhidos pelo primeiro shuf e selecionar as mesmas linhas nos outros arquivos. Como posso fazer isso?

EDITAR:

A primeira resposta foi útil, mas ainda tenho um problema ao selecionar o arquivo correto. Eu tenho 10 arquivos dos quais gostaria de selecionar as mesmas 100 linhas. Eu acabo com 1100 linhas de alguma forma.

    
por StatsSorceress 02.03.2017 / 19:25

3 respostas

0

Você pode primeiro extrair 100 números aleatórios de 3494 e extrair esses números de linha de cada arquivo, por exemplo,

seq 3494 | shuf -n 100 | awk 'NR==FNR{ z[$0]++;next}
{if (FNR in z){ print >FILENAME"_random"}}' - ./*.txt

Isso extrairá a mesma linha no.s de cada arquivo e os salvará em FILENAME"_random"

    
por 02.03.2017 / 19:43
1

Você pode criar um arquivo de script sed simples para imprimir linhas em índices específicos, por exemplo,

printf '%dp\n' $(shuf -i 1-3494 -n 100) > indexfile

use como

sed -nf indexfile File1
sed -nf indexfile File2
.
.

e assim por diante. Se você tem o GNU sed com o -s, --separate você pode selecionar as mesmas linhas de múltiplos arquivos seqüencialmente usando

sed -snf indexfile File1 File2 File3

(substitua File1 File2 File3 por um globo de concha, se desejar).

Se você quer um one-liner que seleciona um subconjunto aleatório diferente a cada invocação, então você poderia fazer algo como

printf '%dp\n' $(shuf -i 1-3494 -n 100) | sed -snf - File1 File2 File3
    
por 02.03.2017 / 21:04
0
perl -ls0777ne 'print for(split $\)[split $\,$r]' -- -r="$(shuf -i 0-3493 -n 100)" -- ./*.txt

r="$(shuf -i 0-3493 -n 5)" \
perl -l -0777ne 'print for(split $\)[split $\,$ENV{r}]' ./*.txt

A combinação aleatória é gerada e passada para Perl através da linha de comando, garantindo assim que todos os arquivos obtenham a mesma sequência aleatória. Cada arquivo é slurped , em seguida, dividido em newline e selecionado de uma só vez por meio da construção @A[...] . Observe que, como Perl's indices começam do zero, o comando shuf recebe 0..3494-1

    
por 03.03.2017 / 03:32