将小文件合并为具有特定大小的大文件并保留行

将小文件合并为具有特定大小的大文件并保留行

我得到了一堆包含“基于行”内容的文件。它们的大小不同,但我需要大量大小相同的文件。

我得到了什么:

  • 文件 1,70 行,5MB
  • 文件 2,113 行,15MB

我想要的是:

  • 文件 1,10MB
  • 文件 2,10MB

我考虑将文件合并在一起,然后使用“split”命令将它们拆分 - 但使用 Split 时会断开行 - 但我需要保留行,只在换行符后进行拆分。使用基于命令行的“split”也不行,因为每行的大小差别很大。

答案1

它不是最快的,但它可以完成你所要求的事情:

#!/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

设置minimumsizeoutdir变量,然后使用您想要按行或大小拆分的文件的路径调用它。

我确信有一个命令可以执行此操作,而且速度更快。

答案2

一个小的 shell 脚本应该可以解决这个问题。

#!/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 MB 的数据。

相关内容