我得到了一堆包含“基于行”内容的文件。它们的大小不同,但我需要大量大小相同的文件。
我得到了什么:
- 文件 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
设置minimumsize
和outdir
变量,然后使用您想要按行或大小拆分的文件的路径调用它。
我确信有一个命令可以执行此操作,而且速度更快。
答案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 的数据。