Разделение файла и его строк под Linux / bash

У меня довольно большой файл (150 миллионов строк по 10 символов). Мне нужно разделить его на 150 файлов по 2 миллиона строк, причем каждая строка вывода будет альтернативно первыми 5 символами или последними 5 символами исходной строки. Я мог бы сделать это на Perl довольно быстро, но мне было интересно, есть ли простое решение с использованием bash. Есть идеи?

Я думаю, вам нужно немного пояснить, в чем именно заключается трансформация. (То есть я не понимаю.) Может быть, небольшой пример?

mweerden 15.09.2008 19:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
3 643
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Домашнее задание? :-)

Я бы подумал, что простого канала с sed (для разделения каждой строки на две) и split (для разделения на несколько файлов) будет достаточно.

Команда man - ваш друг.


Добавлено после подтверждения, что это не домашнее задание:

Как насчет

sed 's/\(.....\)\(.....\)/\n/' input_file | split -l 2000000 - out-prefix-

?

Большой! В итоге я использовал это: для файла в * .txt; сделать echo $ file; sed 's / (.....) (.....) / \ 1 \ r \ n \ 2 /' $ file | split -l 2000000 - $ file.part .; сделано

Sklivvz 15.09.2008 22:11

Думаю, что-то вроде этого могло бы сработать:

out_file=1
out_pairs=0
cat $in_file | while read line; do
    if [ $out_pairs -gt 1000000 ]; then
        out_file=$(($out_file + 1))
        out_pairs=0
    fi
    echo "${line%?????}" >> out${out_file}
    echo "${line#?????}" >> out${out_file}
    out_pairs=$(($out_pairs + 1))
done

Однако не уверен, что это проще или эффективнее, чем использование Perl.

Первые пять символов каждого варианта строки, предполагая, что большой файл называется x.txt, и предполагая, что можно создавать файлы в текущем каталоге с именами x.txt. *:

split -l 2000000 x.txt x.txt.out && (для разделенного файла в x.txt.out *; do outfile = "$ {splitfile} .firstfive"; echo "$ splitfile -> $ outfile"; cut -c 1 -5 "$ splitfile"> "$ outfile"; готово)

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