Как разделить текстовый файл на 70% и 30% с помощью команды split?
Как разделить текстовый файл на 70% и 30% с помощью команды split?
Ответы:
Команды ниже будут работать для процентов выше 50% (если вы хотите разделить только на два файла), быстрый и грязный подход.
1) разделить 70% на основе линий
split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename
2) разделить 70% на основе байтов
split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Вы можете использовать csplit
для разделения на две части (используя любой процент), например, первая часть - первые 20% строк, вторая часть - оставшиеся 80% строк:
csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))
$(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
или даже круче
{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile
хотя некоторые из head
них глупы и не соответствуют стандартам, так что это не будет работать на всех установках ...
{ BS=$(($(wc -c <file) * $P / 100))
dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null
... должен работать в этом простом случае, потому что вы делитесь только один раз - и, вероятно split
, это немного излишне. До тех пор , пока файл является доступным для поиска, dd
будет делать только один read()
ON <stdin
, и поэтому cat
остались начать его read()
в любом пункте dd
оставляет.
Если файл большой, то он count=1 bs=$big_ol_num
может стать немного громоздким, и его можно заблокировать с помощью некоторой дополнительной - но простой - математики оболочки.
Не-вход доступного для поиска - как из трубы - может привести к перекосу dd
«результаты с, хотя это может быть обработано , а также ж / ГНУ dd
» ы iflag=fullblock
.
Следующий код использует head
и tail
работает с любым соотношением (в данном случае от 40 до 60):
export FILE_NAME=train.vw
head -n $[ $(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100 ] ${FILE_NAME} > train_40.vw
tail -n +$[ ($(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100) + 1 ] ${FILE_NAME} > train_60.vw