我遇到一个问题,需要根据某个任意百分比来拆分文件。
如果我有 100 行,我需要将文件按 70%/30% 拆分。
Linux 中的拆分程序没有提供我想要的功能。
如果有一个可以进行任意次数分割的简单函数就好了。
答案1
我创建了这个简单的函数,它能够完成我想要做的事情。
# $1 percentage as a decimal fraction; e.g., 0.75 = 75%
# increase decimal points to get more accurate rounding 0.755
# $2 input file
# $3 output file top percentage
# $4 output file bottom percentage
# e.g., 70% split = 70% top + 30% bottom = 100%
function file_prec_split () {
TOTAL=$(wc -l $2 | cut -d" " -f 1)
TOPPERC=`echo "scale=0; ${TOTAL} * $(printf %.2f $1)" | bc -l | cut -d"." -f 1`
head -n $TOPPERC $2 > $3
tail -n +$TOPPERC $2 > $4
}
echo "`seq 1 100`" > 1to100.txt
file_prec_split 0.30 1to100.txt 30top.txt 70bot.txt
如果您想进行一些更复杂的拆分,例如 40% / 20% / 40%,那么您可以多次运行该函数。您需要分组然后运行拆分。将前 40% 和 20% 合并为 60%。先运行 60% / 40%,然后运行 40% / 20%。
您可能需要做一些简单的数学运算来弄清楚如何计算这种分割。
60%(40%/20%)需要标准化为 100% 这是我计算此分割的方法
0.4/0.6 = .66
0.2/0.6 = .33
(60% / 40%)
file_prec_split 0.60 1to100.txt 60top.txt 40bot.txt
(40% / 20 %) = 60 %
0.4/0.6 = .66
file_prec_split 0.66 60top.txt 40top.txt 20mid.txt
我发现在 Linux 中进行计算时,以下内容很有帮助。额外的小数位有助于在进行拆分时进行更准确的舍入。
SUP_PERCENT=$(printf %.2f $(echo "scale=4; 0.4/0.6" | bc -l))
file_prec_split $SUP_PERCENT 60top.txt 40top.txt 20top.txt