CSVファイルを1行ずつ分割し、両方の出力ファイルにヘッダを保持する方法は?

CSVファイルを1行ずつ分割し、両方の出力ファイルにヘッダを保持する方法は?

次のコマンドを使用して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

split2番目のセクションでは、内容が実際には理解されていないため、ヘッダー行は表示されません。

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

見事に活用できますミラー

この入力ファイルを2つのファイルに分割したい場合

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,

使用できる分割動詞

mlr --csv split -m 2 input.csv

あなたはやる

Column_1,Column_2,Column_3
A,B,C
G,H,I
M,N,O
S,T,U
Y,Z,
Column_1,Column_2,Column_3
D,E,F
J,K,L
P,Q,R
V,W,X

答え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,""

関連情報