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


14

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


您是否愿意使用split命令?如果没有,您可以通过直接的文本操作轻松地做到这一点,当然可以使用perl或python。只要文件不是太错误,就以字符串形式将其读入内存,然后拆分字符串。如果文件太大,则需要做更多的工作。
Faheem Mitha

@Faheem Mitha文件为64MB。我喜欢使用split的想法,因为它比编写代码快。我想知道现在是否指定对应于文件70%的行数,会得到一个大文件和一个小文件。不行吗?
aneuryzm 2011年

是的..它有效..我应该删除问题吗?
aneuryzm 2011年

由您决定,但不是必需的。
Faheem Mitha

请分享您的答案。(meta.stackexchange.com/questions/12513/...
罗布麻

Answers:


13

下面的命令适用于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

1
在MacOSX上,wc有时会返回行数,并在其前面加一个空格,这会破坏此脚本。第一次向xargs传递管道会删除这些空间,并使它们重新工作: split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
EmilStenström18年

4

您可以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笨拙并且不符合标准,所以这不适用于所有设置...


2
{   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离开它。

如果文件很大,则count=1 bs=$big_ol_num可能会有点笨拙,并且可以使用一些额外的但简单的Shell数学将其阻止。

非查找输入-就像从一个管道-可能发生倾斜dd的结果,虽然这可以作为井w / GNU处理ddiflag=fullblock


0

以下代码使用headtail以任意比例(在这种情况下为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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.