次のコマンドを使用してcsvファイル(sample.csv)を分割しようとしています。
split -n 2 -a 1 -d sample.csv test_
同じサイズの2つのファイルを取得しました。 1つはヘッダーがあり、もう1つはヘッダーがなく、末尾の行が切り捨てられます。
以下のスクリプトを見ると、端末に結果が表示されますが、ファイルは生成されません。
split -n 1/2 -a 1 -d sample.csv test_
答え1
どちらのコマンドも設計どおりに動作するようです。
行を考慮しない最初の分割はバイトに分割されます。大規模なバイナリオブジェクトを分割するのに便利ですが、CSVなどの場合はそれほど便利ではありません。
2番目は文書を誤って読んだようです(ただし、技術的にはまだ有効です)。
私の考えでは、あなたがこれをしたいと思います:
split -n l/2 -a 1 -d sample.csv test_
これはまさにあなたがやっているように見えるものではlower case L slash two
ないことに注意してください。one slash two
split
2番目のセクションでは、内容が実際には理解されていないため、ヘッダー行は表示されません。
1つの方法は、次のことを行うことです。
# extract header row and save
head -n1 sample.csv > header
# skip header row and split records to temporary files
tail -n+2 sample.csv | split -n l/2 -a 1 -d temp_
# make final files from header and split records
for f in temp_? ; do
cat header "$f" > "${f/temp/test}"
# clean up temporary file
rm "$f"
done
# clean up header file
rm header
答え2
答え3
複数のコマンドを使用するか、次のようなより重いコマンドを使用する必要がありますawk
。
$ cat in.csv
Column_1,Column_2,Column_3
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
P,Q,R
S,T,U
V,W,X
Y,Z,""
$ awk '
BEGIN { x='"$(awk 'END { print NR }' in.csv)"' / 2 }
NR==1 { print > "out1.csv"; print > "out2.csv"; next }
NR<=x { print > "out1.csv"; next }
{ print > "out2.csv" }
' in.csv
$ cat out1.csv
Column_1,Column_2,Column_3
A,B,C
D,E,F
G,H,I
J,K,L
$ cat out2.csv
Column_1,Column_2,Column_3
M,N,O
P,Q,R
S,T,U
V,W,X
Y,Z,""