分割コマンドを使用してテキストファイルを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
追加された行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
少し過剰になる可能性があります。ファイルを検索できるのは 1 回だけ実行されるため、離れるdd
たびに開始されます。read()
<stdin
cat
read()
dd
ファイルが大きいと、aがcount=1 bs=$big_ol_num
少し扱いにくくなる可能性があります。これは、追加(ただし単純な)シェル計算によって防ぐことができます。
パイプなどで検索できない入力は結果を歪める可能性がありますが、これは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