Объединяющаяся голова и хвост, как Вы сделали, будут работать, но для этого я использовал бы sed
sed -n '1,4000p' input_file # print lines 1-4000 of input_file
Это позволяет Вам решить свою проблему с быстрой функцией оболочки
chunk_it(){
step=4
start=1
end=$step
for n in {1..4} ; do
sed -n "${start},${end}p" "$1" > "$1".$start-$end
let start+=$step
let end+=$step
done
}
chunk_it your_file
Теперь у Вас есть your_file.1-4000 и yuor_file.4001-8000 и так далее.
Примечание: требует удара
По истеричным историческим причинам, od
слова двух байтов печати ¹ по умолчанию.
(Восьмеричный) номер 020061 соответствует двухбайтовой последовательности 1␣
(␣
пробел). Почему? Более ясно, используете ли Вы шестнадцатеричный: 0o20061 = 0x2031, и ␣
0x20 (32) в ASCII и 1
0x31 (49). Заметьте, что биты более низкоуровневые (0x31) соответствуют первому символу, и биты высшего порядка соответствуют второму символу: передозировка собирает слова в порядке с прямым порядком байтов, потому что это, оказывается, порядок байтов Вашей системы. ²
Порядок с прямым порядком байтов не является очень естественным здесь потому что один из выходных форматов (-c
) символы печати, другой один (-o
) слова печати. Каждое слово печатается как число в обычной нотации с обратным порядком байтов (старшая значащая цифра на первом месте в нашем слева направо порядке чтения). Это еще более очевидно в шестнадцатеричном, где границы байта явно очевидны в числовом выводе:
echo '1 text' | od -xc
0000000 2031 6574 7478 000a
1 t e x t \n\0
Если Вы предпочитаете просматривать файл как последовательность байтов, использовать od -t x1
(или hd
если у Вас есть он).
¹ Когда-то давно, мужчины были настоящими мужчинами, компьютеры были реальными компьютерами, числа часто писались в восьмеричном, и слова были два байта длиной.
² Все ПК (x86, x86-64) прямой порядок байтов, как был PDP-11 где запущенный Unix. Центральные процессоры ARM могут справиться с любым порядком байтов, но Linux и iOS используют его в режиме с прямым порядком байтов. Таким образом, большинство платформ, с которыми Вы, вероятно, встретитесь в наше время, является прямым порядком байтов.
Интересный вопрос. После просмотра страницы справочника я нашел, что-o печатает восьмеричный вывод (передозировка == восьмеричный дамп), c, который Вы добавили только, печатает связанные символы также. Вы получаете те же числа с одним только-o.
Рассмотрение вывода, кажется, что передозировка считывает данные два байта за один раз. Возьмите первые два символа, например:
CHAR - OCTAL - BINARY
1 061 0011 0001
SPACE 040 0010 0000
Ответ появляется, когда мы связываем двоичные значения (с '1' справа, ПРОСТРАНСТВО слева):
0010 0000 0011 0001
Преобразование этого двоичного значения к восьмеричному дает нам 020061, который является тем, что распечатала передозировка.
Теперь, почему? Я думаю дело в том, что передозировка читает два байта за один раз, и она не затронута или не знает, что те два байта являются на самом деле двумя отдельными символами.