分割:別のパーセンテージに分割する方法は?

分割:別のパーセンテージに分割する方法は?

分割コマンドを使用してテキストファイルを70%と30%に分割するには?

答え1

以下のコマンドは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

答え2

csplitたとえば、最初の部分 - 行の最初の20%、2番目の部分 - 行の残りの80%など、2つの部分(パーセント使用)に分割できます。

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

$(wc -l < infile):総行数:Percent:
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少し過剰になる可能性があります。ファイルを検索できるのは 1 回だけ実行されるため、離れるddたびに開始されます。read()<stdincatread()dd

ファイルが大きいと、aがcount=1 bs=$big_ol_num少し扱いに​​くくなる可能性があります。これは、追加(ただし単純な)シェル計算によって防ぐことができます。

パイプなどで検索できない入力は結果を歪める可能性がありますが、これはddGNUでも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

関連情報