Разбить текстовый файл пополам на основе шаблона

У меня есть текстовый файл, который выглядит так:

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), и каждая из них содержит 1000 строк (таким образом, 100 * 1000 = 100 000 строк в общей сложности).

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

3 ответа

Решение

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

#!/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. Прежде всего, разбейте этот файл на 100 файлов категорий с помощью:

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

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

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

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

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

#!/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
Другие вопросы по тегам