Связанные, но не удовлетворительные ответы: Как я могу разбить большой текстовый файл на куски по 500 слов или около того?
Я пытаюсь взять текстовый файл ( http://mattmahoney.net/dc/text8.zip ), содержащий> 10 ^ 7 слов, все в одной строке, и разбить его на строки по N слов в каждом. Мой текущий подход работает, но довольно медленный и уродливый (с использованием сценария оболочки):
i=0
for word in $(sed -e 's/\s\+/\n/g' input.txt)
do
echo -n "${word} " > output.txt
let "i=i+1"
if [ "$i" -eq "1000" ]
then
echo > output.txt
let "i=0"
fi
done
Любые советы о том, как я могу сделать это быстрее или компактнее?
text-processing
sed
awk
split
Кори Шиллачи
источник
источник
Ответы:
Предполагая, что ваше определение слова представляет собой последовательность непустых символов, разделенных пробелами, вот
awk
решение для вашего однострочного файлаисточник
Используйте
xargs
(17 секунд):Он использует
-n
флаг,xargs
который определяет максимальное количество аргументов. Просто изменить ,1000
чтобы500
или любой предел вы хотите.Я сделал тестовый файл с 10 ^ 7 словами:
Вот статистика времени:
источник
xargs
сn
медленнее это будет, просто чтобы вы знали. С помощью-n10
я отменил это после примерно 8 минут ожидания ...Perl кажется удивительно хорош в этом:
Создайте файл с 10 000 000 пробелами
Теперь, Perl, чтобы добавить новую строку после каждой 1000 слов
тайминг
проверить результаты
Принятое решение awk заняло чуть более 5 секунд в моем входном файле.
источник
Не очень подходит, когда
N
число слов является большим числом, но если оно небольшое (и в идеале, в вашем однострочном файле нет пробелов в начале / конце), это должно быть довольно быстро (например, 5 слов в строке):источник
paste
строку на лету. Например:tr -s '[[:blank:]]' '\n' < text8 | paste -d' ' $(perl -le 'print "- " x 1000')
set
etc ... и даже тогда, есть максимальное количество аргументов для конкретной системы (я не знаком со всеми разновидностями,paste
но Я думаю, что в некоторых реализациях существуют ограничения в отношении количества аргументов / входных файлов и / или длины выходной строки ...)Эту же команду sed можно упростить, указав, сколько шаблонов пространства слов вы хотите сопоставить. У меня не было больших строковых файлов для тестирования, но без циклов в исходном скрипте это должно работать так же быстро, как ваш процессор может передавать данные. Дополнительное преимущество, оно будет одинаково хорошо работать с многострочными файлами.
источник
Достопочтенная
fmt(1)
команда, хотя и не строго работает с «определенным количеством слов», может довольно быстро перенести длинные строки на конкретную цель (или максимальную) ширину:Или с современным perl, для определенного числа слов, скажем, 10, и принимая один пробел в качестве границы слова:
источник
Команда coreutils
pr
- еще один кандидат: похоже, единственная складка заключается в том, что необходимо заставить ширину страницы быть достаточно большой, чтобы соответствовать ширине вывода.Используя файл, созданный с помощью генератора 100000000 @ Glenn_Jackman,
где количество подтверждено следующим образом
[Perl-решение Гленна все еще немного быстрее, ~ 1.8с на этой машине].
источник
в го я бы попробовал вот так
источник