在 Linux 中使用 Bash 如何根据百分比分割文本文件

在 Linux 中使用 Bash 如何根据百分比分割文本文件

我遇到一个问题,需要根据某个任意百分比来拆分文件。

如果我有 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 

相关内容