Объединение небольших файлов в более крупные с определенным размером и сохранением строк

0

Я получил кучу файлов с «линейным» контентом. Они имеют разные размеры, но мне нужно много файлов с одинаковыми размерами.

Что я имею:

  • Файл 1, 70 строк, 5 МБ
  • Файл 2, 113 строк, 15 МБ

Что я хочу:

  • Файл 1, 10 МБ
  • Файл 2, 10 МБ

Я хотел объединить файлы и разделить их с помощью команды «split» - но при использовании Split это разрывает строки - но мне нужно сохранить строки и разбивать их только после разрыва строки. Использование «разделенной» командной строки на основе также не сработает, поскольку размер отдельных строк сильно отличается.

PascalTurbo
источник
1
Если размеры строки сильно меняются, ответьте на этот вопрос: если у вас есть строка, которая делает файл размером 10239 КБ (чуть менее 10 МБ), а добавленная строка делает его 10241 КБ (чуть более 10 МБ), сделайте Вы хотите, чтобы линия была включена или нет?
Мастер-парень
Лучше, если
размер

Ответы:

0

Это не самый быстрый, но он делает то, что вы просили:

#!/bin/bash
minimumsize=10000
actualsize=0
infile=$(basename "$1")
filenum=1
outdir=/home/user/bin/testing/tmp
outfile=$infile.out$filenum

if [ ! -f "$outdir/$outfile" ]; then
    mkdir -p "`dirname \"$outdir/$outfile\"`" 2>/dev/null
fi

while read line
do
    if [ $actualsize -ge $minimumsize ]; then
        (( filenum++ ))
        outfile=$infile.out$filenum
        if [ ! -f "$outdir/$outfile" ]; then
            mkdir -p "`dirname \"$outdir/$outfile\"`" 2>/dev/null
        fi
    fi
    echo $line >> $outdir/$outfile
    actualsize=$(wc -c "$outdir/$outfile" | cut -f 1 -d ' ')
done < $1

Установите minimumsizeи outdirпеременные затем вызвать его на путь к файлу , который вы хотите разделить на линии или размера.

Я уверен, что для этого есть команда, которая намного быстрее.

krowe
источник
0

Небольшой сценарий оболочки должен решить проблему.

#!/bin/bash
file="part"
ext=".txt"
n=1
while read line
do
  fname=$file$n$ext
  echo $line >> $fname
  bytes=`wc -c $fname | cut -f1 -d' '`
  if [ $bytes -ge 10485760 ]
  then
    n=$((n+1))
  fi
done < input.txt

input.txtВаш входной файл и сценарий должен выдавать результат , как part1.txt, part2.txt, part3.txt... каждый из которых имеет данные ~ 10 МБ в нем.

Аян
источник