splitコマンドを使用してテキストファイルを70%と30%に分割するにはどうすればよいですか?
splitコマンドを使用してテキストファイルを70%と30%に分割するにはどうすればよいですか?
回答:
以下のコマンドは、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
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
csplit
最初の部分-最初の20%の行、2番目の部分-残りの80%の行など、2つの部分に分割できます(任意のパーセンテージを使用)。
csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))
$(wc -l < infile)
:合計行数
2 / 10
:パーセンテージ
+1
:csplit
分割されるため、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
は愚かで標準に準拠していないので、これはすべてのセットアップで動作しません...
{ 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_num
aは少し扱いにくくなり、余分な-まだ簡単な-シェルの数学でブロックすることができます。
パイプからのような- -非シーク入力がスキューかもしれないdd
「これは十分/ GNU Wとして扱うことができるが、複数の結果をdd
S」iflag=fullblock
。
次のコードは、任意の比率(この場合は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