分割:異なる割合に分割する方法


14

splitコマンドを使用してテキストファイルを70%と30%に分割するにはどうすればよいですか?


splitコマンドを使用することに結婚しましたか?そうでない場合は、perlまたはpythonを使用して、単純なテキスト操作で簡単にこれを行うことができます。ファイルが間違っていなければ、文字列としてメモリに読み込み、文字列を分割します。ファイルが大きすぎる場合は、さらに作業が必要です。
ファヒムミタ

@Faheem Mithaファイルは64MBです。コードを書くよりも速いので、分割を使用するというアイデアが好きです。ファイルの70%に対応する行数を指定すると、大きなファイルと小さなファイルになります。うまくいかない?
動脈瘤

そして、はい..それは働いた..私は質問を削除すべきですか?
動脈瘤

あなた次第ですが、必要ではありません。
ファヒムミタ

回答を共有してください。(meta.stackexchange.com/questions/12513/...
dogbane

回答:


13

以下のコマンドは、50%を超えるパーセンテージ(2つのファイルのみに分割する場合)、迅速かつダーティーなアプローチで機能します。

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
エミルStenström

4

csplit最初の部分-最初の20%の行、2番目の部分-残りの80%の行など、2つの部分に分割できます(任意のパーセンテージを使用)。

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

$(wc -l < infile):合計行数
2 / 10:パーセンテージ
+1csplit分割されるため、1行追加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()onを1回だけ実行します。その<stdinため、ファイルを残すポイントでcat開始します。read()dd

ファイルが大きい場合、count=1 bs=$big_ol_numaは少し扱いに​​くくなり、余分な-まだ簡単な-シェルの数学でブロックすることができます。

パイプからのような- -非シーク入力がスキューかもしれないdd「これは十分/ GNU Wとして扱うことができるが、複数の結果をddS」iflag=fullblock


0

次のコードは、任意の比率(この場合は40〜60)を使用headしてtail機能します。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.