このワンライナーは、大きな csv を 999 レコードの断片に分割し、各レコードの上部にあるヘッダー行を保持します (999 レコード + 1 ヘッダー =1000 行)
cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'
Ole Tange の回答に基づいています。
並列インストールに関するヒントについては、コメントを参照してください
これはロブルスカのです スクリプトを少しクリーンアップ:
tail -n +2 file.txt | split -l 4 - split_
for file in split_*
do
head -n 1 file.txt > tmp_file
cat "$file" >> tmp_file
mv -f tmp_file "$file"
done
wc
を削除しました 、 cut
、 ls
と echo
不要な場所に。ファイル名の一部を変更して、もう少し意味のあるものにしました。読みやすくするために複数行に分割しました。
派手にしたい場合は、 mktemp
を使用できます または tempfile
ハードコードされたファイル名を使用する代わりに、一時的なファイル名を作成します。
編集
GNU split
の使用 これを行うことができます:
split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }; export -f split_filter; tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_
読みやすくするために分割:
split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }
export -f split_filter
tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_
--filter
のとき が指定されている、split
出力ファイルごとにコマンド (この場合はエクスポートする必要がある関数) を実行し、変数 FILE
を設定します。 、コマンドの環境で、ファイル名に。
フィルター スクリプトまたは関数は、出力内容やファイル名に対して必要な操作を行うことができます。後者の例は、可変ディレクトリ内の固定ファイル名に出力することです:> "$FILE/data.dat"
例えば。
GNU coreutils split>=8.13 (2011) で新しい --filter 機能を使用できます:
tail -n +2 FILE.in | split -l 50 - --filter='sh -c "{ head -n1 FILE.in; cat; } > $FILE"'