Unixでは、大容量ファイルを複数のファイルに分割する

Unixでは、大容量ファイルを複数のファイルに分割する

複数行(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および参照-asplit、同様の名前のファイルは100(3桁のサフィックス長)未満の場合はアルファベット順に並べ替えられますnew_file00new_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

おすすめ記事