大きな部分のcsvファイル(〜100GB)を分割し、各部分のヘッダーを保持する方法は?大きなcsvファイルを分割して各部分にヘッダーを保持
例えばh1 h2
a aa
b bb
に
h1 h2
a aa
と
h1 h2
b bb
大きな部分のcsvファイル(〜100GB)を分割し、各部分のヘッダーを保持する方法は?大きなcsvファイルを分割して各部分にヘッダーを保持
例えばh1 h2
a aa
b bb
に
h1 h2
a aa
と
h1 h2
b bb
まず、ヘッダとコンテンツを分離する必要があります
header=$(head -1 $file)
data=$(tail -n +2 $file)
は、その後、あなたはあなたがデータチャンクのサイズと結果のファイル名のパターンを指定する必要がオプションで
echo $data | split [options...] -
を分割したいです。末尾の-
は、stdinからデータを読み取るためにsplit
と指定されているため、削除しないでください。
次に、あなたはあなたが明らかにループの中でその最後の部分を行う必要がありますが、その正確なコードがsplit
操作のために選ばれたプレフィックスに依存し、各ファイルの先頭に
sed -i "1i$header" $splitOutputFile
をヘッダに挿入することができます。
私のスクリプトがターゲットとしていたMacシステムでこれが正しく動作しないことが判明しました(理由はAppleですか?なぜですか?)私は最終的には概念の証明としてうまくいったprintfオプションを使いました。私は一時的なファイルをramdiskなどに入れてパフォーマンスを向上させることでこれを強化するつもりです。これは、ディスクに束を置き、おそらく遅くなるからです。
#!/bin/sh
# Pass a file in as the first argument on the command line (note, not secure)
file=$1
# Get the header file out
header=$(head -1 $file)
# Separate the data from the header
tail -n +2 $file > output.data
# Split the data into 1000 lines per file (change as you wish)
split -l 1000 output.data output
# Append the header back into each file from split
for part in `ls -1 output*`
do
printf "%s\n%s" "$header" "`cat $part`" > $part
done
このような小さな例でどのように「各部」が分かりますか? – fedorqui
これは広すぎます。あなたが試したことと一緒に[mcve]を提供してください。 – fedorqui