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

Что я имею:

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

Что я хочу:

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

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

2 ответа2

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 переменные затем вызвать его на путь к файлу , который вы хотите разделить на линии или размера.

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

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 МБ данных.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .