разделение txt файл в половине на основе шаблона

У меня есть текстовый файл, который похож на это:

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

Последнее число в каждой строке является категорией. У меня есть 100 категорий (от 0 до 99), и каждый содержит 1 000 строк (так 100 * 1,000 = 100 000 строк всего).

Я хотел бы разделить этот файл на две случайных половины, т.е. одна половина содержит 50 случайных категорий, и другая половина содержит другие 50 категорий.

1
задан 18 March 2016 в 20:57

3 ответа

Этот делает это тот путь, это переставляет каждую главу и проводит "lineswanted" строки от результата для окончательного хранения его в обеих половинах файлов:

#!/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
1
ответ дан 7 December 2019 в 12:41

Можно выполнить шаги ниже, чтобы сделать работу:

  1. , В первую очередь, разделяет этот файл на 100 файлов категорий с использованием:

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

для первой категории.

  1. Теперь у Вас есть 100 файлов: 1.txt, 2.txt...., 100.txt. Каждый из этих файлов имеет 1 000 строк. можно выбрать строку из этих файлов случайным образом следующей командой и вставить firsthalf.txt и secondhalf.txt:

    shuf -n 1 filename
    
  2. На каждом из вышеупомянутых шагов можно использовать циклы для улучшения скорости.

1
ответ дан 7 December 2019 в 12:41

Этот сценарий должен сделать это. В обеих половинах файлов строки главы отсортированы как во входном файле, но главы самом переставляются. Если Вам нужно. Я могу расширить сценарий, чтобы отсортировать главы в каждой половине или переставить строки всей главы в одном файле, также.

#!/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
1
ответ дан 7 December 2019 в 12:41

Другие вопросы по тегам:

Похожие вопросы: