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





Домашнее задание? :-)
Я бы подумал, что простого канала с 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 .; сделано
Думаю, что-то вроде этого могло бы сработать:
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"; готово)
Я думаю, вам нужно немного пояснить, в чем именно заключается трансформация. (То есть я не понимаю.) Может быть, небольшой пример?