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

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


person Sklivvz    schedule 15.09.2008    source источник
comment
Я думаю, вам нужно немного яснее понять, что такое трансформация. (То есть я не понимаю.) Может быть, небольшой пример?   -  person mweerden    schedule 15.09.2008


Ответы (3)


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

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

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


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

Как насчет

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

?

person HD.    schedule 15.09.2008
comment
Большой! В итоге я использовал это: для файла в формате *.txt; выполнить эхо $file; sed 's/(.....)(.....)/\1\r\n\2/' $file | разделить -l 2000000 - $file.part.; Выполнено - person Sklivvz; 15.09.2008

Я думаю, что что-то вроде этого может работать:

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.

person che    schedule 15.09.2008

Первые пять символов каждого варианта строки, при условии, что большой файл называется 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"; готово)

person Troels Arvin    schedule 15.09.2008