Dividir arquivo de texto em metades aleatórias com base na categoria

2

Eu tenho um arquivo de texto com esta aparência:

n03250847/n03250847_0.JPEG n03250847
n03250847/n03250847_1.JPEG n03250847
...
n03250847/n03250847_499.JPEG n03250847
...
n03255030/n03255030_0.JPEG n03255030
n03255030/n03255030_1.JPEG n03255030
...
n03255030/n03255030_499.JPEG n03255030

O último número depois do espaço é o número da categoria. Eu tenho 200 categorias diferentes, e por categoria existem 500 linhas (0 a 499). Eu gostaria de dividir este arquivo em dois, onde cada arquivo resultante contém 100 categorias aleatórias.

    
por apples-oranges 27.03.2016 / 21:11

1 resposta

1

Se você não se importar em dividir o arquivo com base na categoria e trabalhar com as partes, poderá fazer isso:

split -l 500 -a 3 infile
rnd=( $(printf %s\n x??? | shuf -n 100) )
cat "${rnd[@]}" > rand1
rm "${rnd[@]}"
cat x??? > rand2
rm x???

Este split s o arquivo em 200 partes de 500 linhas cada (uma única peça por categoria) e seleciona 100 peças aleatórias via shuf - os nomes de arquivos são salvos em uma matriz - rnd . Em seguida, mescla as partes listadas na matriz em rand1 , exclui-as e mescla as partes restantes em rand2 e as exclui também. Esta solução assume que as linhas em seu arquivo estão agrupadas por categoria e que os únicos nomes de arquivos que correspondem a x??? no diretório atual são aqueles produzidos pelo comando split .

    
por 27.03.2016 / 22:27