Вы намерены использовать команду split? Если нет, то вы можете легко сделать это с помощью простых текстовых манипуляций, конечно, используя perl или python. Пока файл не слишком неправильный, считайте его в память как строку, а затем разбейте строку. Если файл слишком большой, требуется больше работы.
Фахим Митха
@Faheem Mitha Файл размером 64 МБ. Мне нравится идея использовать split, потому что это быстрее, чем написание кода. Мне было интересно, если я укажу количество строк, соответствующее 70% файла, я получу большой файл и маленький файл. Разве это не должно работать?
aneuryzm
И да .. это сработало .. Должен ли я удалить вопрос?
В MacOSX wc иногда возвращает количество строк с пробелом перед ним, что нарушает этот скрипт. Первый трубопровод к xargs удалит эти пробелы и заставит все снова работать: split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Эмиль Стенстрём,
4
Вы можете использовать csplitдля разделения на две части (используя любой процент), например, первая часть - первые 20% строк, вторая часть - оставшиеся 80% строк:
$(wc -l < infile): общее количество строк 2 / 10: процент +1: добавить одну строку, потому что csplitразделяетup to but not including line N
Вы можете разделить только на основе строк, хотя.
В основном, если у вас есть номер строки, $(( $(wc -l < file) * 2 / 10))вы можете использовать любой инструмент, ориентированный на строки:
sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile
... должен работать в этом простом случае, потому что вы делитесь только один раз - и, вероятно split, это немного излишне. До тех пор , пока файл является доступным для поиска, ddбудет делать только один read()ON <stdin, и поэтому catостались начать его read()в любом пункте ddоставляет.
Если файл большой, то он count=1 bs=$big_ol_numможет стать немного громоздким, и его можно заблокировать с помощью некоторой дополнительной - но простой - математики оболочки.
Не-вход доступного для поиска - как из трубы - может привести к перекосу dd«результаты с, хотя это может быть обработано , а также ж / ГНУ dd» ы iflag=fullblock.
Ответы:
Команды ниже будут работать для процентов выше 50% (если вы хотите разделить только на два файла), быстрый и грязный подход.
1) разделить 70% на основе линий
2) разделить 70% на основе байтов
источник
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Вы можете использовать
csplit
для разделения на две части (используя любой процент), например, первая часть - первые 20% строк, вторая часть - оставшиеся 80% строк:$(wc -l < infile)
: общее количество строк2 / 10
: процент+1
: добавить одну строку, потому чтоcsplit
разделяетup to but not including line N
Вы можете разделить только на основе строк, хотя.
В основном, если у вас есть номер строки,
$(( $(wc -l < file) * 2 / 10))
вы можете использовать любой инструмент, ориентированный на строки:или даже круче
хотя некоторые из
head
них глупы и не соответствуют стандартам, так что это не будет работать на всех установках ...источник
... должен работать в этом простом случае, потому что вы делитесь только один раз - и, вероятно
split
, это немного излишне. До тех пор , пока файл является доступным для поиска,dd
будет делать только одинread()
ON<stdin
, и поэтомуcat
остались начать егоread()
в любом пунктеdd
оставляет.Если файл большой, то он
count=1 bs=$big_ol_num
может стать немного громоздким, и его можно заблокировать с помощью некоторой дополнительной - но простой - математики оболочки.Не-вход доступного для поиска - как из трубы - может привести к перекосу
dd
«результаты с, хотя это может быть обработано , а также ж / ГНУdd
» ыiflag=fullblock
.источник
Следующий код использует
head
иtail
работает с любым соотношением (в данном случае от 40 до 60):источник