divide o arquivo txt ao meio com base no padrão

1

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

train/a/abbey/00000001.jpg 0
...
train/a/abbey/00000999.jpg 0
train/a/abbey/00001000.jpg 0
train/a/airport_terminal/00000001.jpg 1
train/a/airport_terminal/00000002.jpg 1
...
train/c/corn_field/00000354.jpg 40
train/c/corn_field/00000355.jpg 40
train/c/corn_field/00000356.jpg 40
...
train/y/yard/00000998.jpg 99
train/y/yard/00000999.jpg 99
train/y/yard/00001000.jpg 99

O último número em cada linha é a categoria. Eu tenho 100 categorias (0 a 99) e cada uma contém 1.000 linhas (100 * 1.000 = 100.000 linhas no total).

Gostaria de dividir este arquivo em duas metades aleatórias , ou seja, uma metade contém 50 categorias aleatórias e a outra metade contém as outras 50 categorias.

    
por apples-oranges 18.03.2016 / 18:57

3 respostas

1

Este faz assim, embaralha cada capítulo e pega linhas "lineswanted" do resultado para finalmente armazená-lo nos dois metades:

#!/bin/bash

lineswanted=300
infile="full"
half1="half1"
half2="half2"

# Build chapterlist 0 1 2 3 ....
chapterlist=""
for (( i=0 ; i<100; i=i+1 )) ; do
  chapterlist="$chapterlist $i"
done

# shuffle chapterlist
randomchapterlist="'shuf -e $chapterlist'"

rm -f "$half1" "$half2"

i=0
for chapter in $randomchapterlist ; do
  if [ $i -lt 50 ] ; then
    egrep ".*\ $chapter$" "$infile" | shuf | head -n $lineswanted >> "$half1"
  else
    egrep ".*\ $chapter$" "$infile" | shuf | head -n $lineswanted >> "$half2"
  fi
  i=$(( i+1 ));
done
    
por cmks 18.03.2016 / 22:31
1

Você pode seguir as etapas abaixo para realizar seu trabalho:

  1. Primeiro, divida esse arquivo em 100 categorias usando:

    sed -n '0,99p' file >> 1.txt
    

para a primeira categoria.

  1. Agora você tem 100 arquivos: 1.txt, 2.txt, ...., 100.txt. Cada um desses arquivos tem 1000 linhas. você pode selecionar uma linha desses arquivos aleatoriamente seguindo o comando e colocar em firsthalf.txt e secondhalf.txt :

    shuf -n 1 filename
    
  2. Em cada uma das etapas acima, você pode usar loops para melhorar sua velocidade.

por Mahdi 18.03.2016 / 20:40
1

Esse script deve fazer isso. Nos dois arquivos de meia, as linhas do capítulo são classificadas como no arquivo de entrada, mas os próprios capítulos são embaralhados. Se você precisar. Eu posso estender o script para classificar os capítulos em cada metade ou embaralhar as linhas de todos os capítulos em um arquivo também.

#!/bin/bash

# Build chapterlist 0 1 2 3 ....
chapterlist=""
for (( i=0 ; i<100; i=i+1 )) ; do
  chapterlist="$chapterlist $i"
done

# shuffle chapterlist
randomchapterlist="'shuf -e $chapterlist'"

# "full" is input file
# half1 and half2 are output files
rm -f half1 half2

i=0
for chapter in $randomchapterlist ; do
  if [ $i -lt 50 ] ; then
    egrep ".*\ $chapter$" full >> half1
  else
    egrep ".*\ $chapter$" full >> half2
  fi
  i=$(( i+1 ));
done
    
por cmks 18.03.2016 / 21:12