Вопрос

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

Это было полезно?

Решение

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

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

Командующий людьми - ваш друг.


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

Как насчет

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

?

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

Я думаю, что что-то подобное могло бы сработать:

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.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top