如何使用 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
添加一行csplit
up 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()
<stdin
cat
read()
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