複数行(9074行)を含むファイルがあり、残りの行数を含む最後のファイルを除いて、同じ行数を含む10個のファイルに分割したいと思います。
split -l `wc -l myfile | awk '{print $1/10}'` myfile
split: invalid number of lines: ‘907.4’
最後のファイルに907 + 4行を含めたい
ベストアンサー1
あなたはする必要があります整数-l
除算で取得したパラメータ値ですsplit
。シェルは整数除算に適しています。
lines_number=$(wc -l < file)
split -l $((lines_number / 10)) file
wc -l x*
907 xaa
907 xab
907 xac
907 xad
907 xae
907 xaf
907 xag
907 xah
907 xai
907 xaj
4 xak
9074 total
これを使用するにはawk
整数を印刷する必要があります。
wc -l file | awk '{print int($1/10)}'
907
最後の2つのファイルをリンクする必要があります。すべて同じ空のディレクトリに出力すると仮定すると、次のことができます。
printf "%s\n" x* | tail -n2 | xargs cat > last_file
wc -l < last_file
911
上記では、globマッチがアルファベット順に新しいファイルを取得し、分割が出力ファイルの名前をその順序で指定することを知っています。
split
注:また、次の出力ファイルにカスタムプレフィックスと数値インデックスを使用したいと思います。
split -d -l 907 file new_file
注:サフィックス長のデフォルト値は2なので(man split
および参照-a
)split
、同様の名前のファイルは100(3桁のサフィックス長)未満の場合はアルファベット順に並べ替えられますnew_file00
。new_file01
数字のサフィックス(人が読みやすいように)とアルファベット順の両方を持つ別のオプションは、サフィックスの長さを-a
適切な値に設定することです。
プロセス全体を小さなスクリプトに含めるには、次のようにします。また、モジュラスがゼロであることを確認する機能も追加しました。この場合、出力ファイルは変更されません。
#!/bin/bash
f="file"
prefix="new_file"
lines_number=$(wc -l < "$f")
split -d -l $((lines_number / 10)) "$f" "$prefix"
if ((lines_number % 10 != 0)); then
last_file=$(printf "%s\n" "$prefix"* | tail -1)
pre_last_file=$(printf "%s\n" "$prefix"* | tail -2 | head -1)
cat "$last_file" >> "$pre_last_file" && rm -- "$last_file"
fi