Как я могу разделить файл крупного текста на блоки приблизительно 500 слов?

#!/bin/bash  

SAVEIFS=$IFS  
IFS="\n\b"  
#-----------------------------------------------------------------------------  

#work in current dir if work path was not provided  
[ $# -eq 0 ] && search_path="." || search_path="$1"  


# files to be moved, more extensions can be added  
wildcard="*[jpg|JPG]"  


move_jpg() {  
    # create "Covers" if it doesn't exist  
    [ -d "$1/Covers" ] && echo -n " ... " || { echo -n " ...create Covers ";   mkdir "$1/Covers" }  

    mv "$1/$wildcard" "$1/Covers/$wildcard"  
    echo "... files moved"  
}  



for d in "$search_path/*/"; do  

    echo -n "testing <$d>   "  

    [ -e "$d/$wildcard" ] && ${move_jpg "$d"} || echo "...Not found <$wildcard>"  

done  



#-----------------------------------------------------------------------------  
IFS=$SAVEIFS  
4
01.03.2013, 09:18
6 ответов

Должен это быть покончить wc? Поскольку здесь я имею, столкнулся с очень хорошей попыткой использовать regex в качестве a csplit шаблон. У меня нет системы для тестирования его прямо сейчас, но сами regex, кажется, делают задание.

Выражение похоже на это:

 csplit input-file.txt '/([\w.,;]+\s+){500}/'
4
27.01.2020, 20:58
  • 1
    , но это не работает: bash: syntax error near unexpected token ('' –  ixtmixilix 01.03.2013, 10:24
  • 2
    @ixtmixilix необходимо заключить аргумент в кавычки в пользу оболочки. –  Gilles 'SO- stop being evil' 02.03.2013, 01:26
  • 3
    С кавычками я добираюсь: csplit: '/([\\w.,;]+\\s+){500}/': match not found –  Jonathan 02.03.2013, 02:01

Утилиты Unix обычно воздействуют на сплошные линии, таким образом, Ваш лучший выбор состоит в том, чтобы сначала изменить Ваш вход так, чтобы он записал одно слово на строку, как это (Вам, возможно, придется изменить эту команду немного, если у Вас есть другие символы в Ваших словах):

<inputfile tr -c A-Za-z0-9 \\n

Так как Вы только интересуетесь словами, это могла бы быть хорошая идея избавиться от пустых строк путем передачи по каналу вывода в a grep звонить. Вот то, как Ваша полная команда могла бы быть похожей:

<inputfile tr -c A-Za-z0-9 \\n | grep -v '^$' | split -l 500

Вы могли позже присоединиться к новым файлам для возвращения всего на одной строке (использующий что-то как tr -d \\n), но если Вы - планирование выполнения большего количества управления с инструментами Unix, сохраните их этим путем, split не единственная программа, которая будет воздействовать на целые строки.

0
27.01.2020, 20:58
  • 1
    Это интересно, но полностью забивает содержание текста (в этом случае, роман). Идеально, я хотел бы сохранить разрывы строки, где они. –  Jonathan 02.03.2013, 22:49
  • 2
    Да я думал о сохранении разрывов строки, и я могу думать о нескольких взломах для получения их после обработки, (как начальная замена их с уникальным символом и переводом, что уникальный символ назад к новой строке в конце), но я боюсь, что не знаю, что надлежащая техника делает это устойчивым способом, который гарантирует 100%-й успех. Мне жаль, что кто-то с большим опытом не мог вмешаться для решения этой проблемы. –  rahmu 03.03.2013, 04:57

Попытайтесь делать это:

file=/etc/passwd
count=2
count_file_lines=$(wc -l < "$file")
split -n$((count_file_lines/count)) "$file"
ls -ltr x*

Это разделит файл на $count (2)

0
27.01.2020, 20:58
  • 1
    , которые Op хочет разделить словами, не строками. Кроме того, почему Вы используете переменную для количества, если оно не изменяется? –  terdon♦ 01.03.2013, 13:02

Посмотрите, помогает ли это (я попробовал бы его во временном каталоге сначала):

perl -e '
         undef $/;
         $file=<>;
         while($file=~ /\G((\S+\s+){500})/gc)
         {
            $i++;
            open A,">","chunk-$i.txt";
            print A $1;
            close A;
         }
         $i++;
         if($file=~ /\G(.+)\Z/sg)
         {
          open A,">","chunk-$i.txt";
          print A $1;
         }
        '  your_file_name_here

Править: Код исправлен и протестирован. Извините за предыдущие ошибки.

Редактирование 2: Это выложит названные файлы chunk-#.txt запуск с chunk-1.txt. Каждый "блок" будет содержать 500 слов, и последний "блок" будет содержать то, что оставляют в файле (<=500 слов). Можно настроить это поведение путем изменения соответствующих частей в коде.

0
27.01.2020, 20:58

Вы также можете использовать это программное обеспечение для файлов с разделенными словами. Word Files Splitter - это отличный инструмент для разделения файла с одним словом на несколько файлов с несколькими словами в зависимости от количества страниц или количества разделов в файле с одним словом.

http://www.windowindia.net/word-files-splitter.html

0
27.01.2020, 20:58

Эта простая командная строка должна выполнить свой трюк. Из исходного текстового файла она создаст несколько фрагментов по 70 символов

cntr=1;for chunk in `sed -e 's/.\{70\}/&\n/g' source.txt`; do echo $chunk > chunk$cntr.txt; cntr=$(( $cntr + 1 )); done
-1
27.01.2020, 20:58

Теги

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