分割:如何分割成不同的百分比?

分割:如何分割成不同的百分比?

如何使用 split 命令将文本文件拆分为 70% 和 30%?

答案1

下面的命令适用于 50% 以上的百分比(如果您只想拆分成两个文件),这是快速而肮脏的方法。

1)根据线路分割70%

split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename 

2)根据字节分割70%

split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename

答案2

您可以csplit将其分成两部分(使用任意百分比),例如第一部分 - 前 20% 的行,第二部分 - 其余 80% 的行:

csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))

$(wc -l < infile):总行数
2 / 10:百分比:由于拆分,
+1添加一行csplitup to but not including line N

不过,您只能根据线条进行分割。
基本上,只要您有行号,$(( $(wc -l < file) * 2 / 10))就可以使用任何面向行的工具:

sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile

或者,更酷的是:

{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile

虽然有些head人很蠢而且不会符合标准所以这不适用于所有设置......

答案3

{   BS=$(($(wc -c <file) * $P / 100))
    dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null

...应该适用于这个简单的情况,因为你只分裂一次 - 所以可能split有点矫枉过正。只要文件是可查找的,就只会在 上dd执行一次,因此无论何时离开它,都将开始它。read()<stdincatread()dd

如果文件很大,那么 acount=1 bs=$big_ol_num可能会变得有点笨拙,并且可以通过一些额外的(但简单的)shell 数学来阻止它。

不可搜索的输入(例如来自管道的输入)可能会扭曲dd结果,尽管这也可以通过 GNU 来dd处理iflag=fullblock

答案4

以下代码使用head任意tail比例(在本例中为 40 到 60):

export FILE_NAME=train.vw
head -n $[ $(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100 ] ${FILE_NAME} > train_40.vw
tail -n +$[ ($(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100) + 1 ] ${FILE_NAME} > train_60.vw

相关内容