#!/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
Должен это быть покончить wc
? Поскольку здесь я имею, столкнулся с очень хорошей попыткой использовать regex в качестве a csplit
шаблон. У меня нет системы для тестирования его прямо сейчас, но сами regex, кажется, делают задание.
Выражение похоже на это:
csplit input-file.txt '/([\w.,;]+\s+){500}/'
Утилиты 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
не единственная программа, которая будет воздействовать на целые строки.
Попытайтесь делать это:
file=/etc/passwd
count=2
count_file_lines=$(wc -l < "$file")
split -n$((count_file_lines/count)) "$file"
ls -ltr x*
Это разделит файл на $count
(2)
Посмотрите, помогает ли это (я попробовал бы его во временном каталоге сначала):
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 слов). Можно настроить это поведение путем изменения соответствующих частей в коде.
Вы также можете использовать это программное обеспечение для файлов с разделенными словами. Word Files Splitter - это отличный инструмент для разделения файла с одним словом на несколько файлов с несколькими словами в зависимости от количества страниц или количества разделов в файле с одним словом.
Эта простая командная строка должна выполнить свой трюк. Из исходного текстового файла она создаст несколько фрагментов по 70 символов
cntr=1;for chunk in `sed -e 's/.\{70\}/&\n/g' source.txt`; do echo $chunk > chunk$cntr.txt; cntr=$(( $cntr + 1 )); done
bash: syntax error near unexpected token
('' – ixtmixilix 01.03.2013, 10:24csplit: '/([\\w.,;]+\\s+){500}/': match not found
– Jonathan 02.03.2013, 02:01