結果

結果

1行に約2000列のcsvファイルがあり、それを6つの列に分割する必要があります。スライスした後は、スライスを積み重ねる必要があります。

たとえば、

A1,B1,C1,D1,E1,F1,A2,B2,C2,D2,E2,F2
G1,H1,I1,J1,K1,L1,G2,H2,I2,J2,K2,L2

になります:

A1,B1,C1,D1,E1,F1
G1,H1,I1,J1,K1,L1
A2,B2,C2,D2,E2,F2
G2,H2,I2,J2,K2,L2

シェルのコマンドラインでこれをどのように実行しますか?

答え1

プロセスがこれを効率的に実行できるかどうか疑わしいので、次のようなループを作成することをお勧めします。

for (( i=1 ; i < 2000; i+=6 )); do
  j=$((i+5))
  cut -d, -f $i-$j your.csv
done

答え2

Python解決策:

入力ファイルの例test.csv:

A1,B1,C1,D1,E1,F1,A2,B2,C2,D2,E2,F2,A3,B3,C3,D3,E3,F3,A4,B4,C4,D4,E4,F4
G1,H1,I1,J1,K1,L1,G2,H2,I2,J2,K2,L2,G3,H3,I3,J3,K3,L3,G4,H4,I4,J4,K4,L4

Slice_on_6.pyスクリプト:

import sys, csv
with open(sys.argv[1], 'r') as fh:  # opening csv file
    reader = list(csv.reader(fh))   # reader object which will iterate over lines in the given csvfile
    cnt = len(reader[0])//6         # number(count) of slices
    for i in range(cnt):
        for l in reader:
            print(','.join(l[i*6:6*(i+1)]))  # outputting each slice from each line consecutively

使用法:

python slice_on_6.py test.csv

出力:

A1,B1,C1,D1,E1,F1
G1,H1,I1,J1,K1,L1
A2,B2,C2,D2,E2,F2
G2,H2,I2,J2,K2,L2
A3,B3,C3,D3,E3,F3
G3,H3,I3,J3,K3,L3
A4,B4,C4,D4,E4,F4
G4,H4,I4,J4,K4,L4

答え3

表示されているツールを試すことができますsed。基本的なトピックは、最初のステップとしてパターン空間からファイルを読み取ることです。

次に、最初の6つの要素を割り当ててから部品を印刷し、線をパターンスペースの後ろに移動します(印刷された部品をソーイングした後)。

次に、パターン空間でガイドラインをすすぎ、プロセスを繰り返します。

このプロセスは、パターンスペースに最後の行の最後の部分だけが残ると停止し、この時点でsed先行改行を削除してから単に印刷します。

部分は6つのcsvフィールドであり、各行の合計フィールド数は6の倍数であり、各行のフィールド数は同じです。

sed -e '
   $!{
      s/$/,/
      N;s/^/\n/;D
   }

   s/^\([^,]*,\n\{0,1\}\)\{6\}/&\n/
   s/\n\n/\n/
   s/,\n/\n/

   P

   y/\n_/_\n/
   s/^[^_]*_//
   s/^\([^_]*\)_\(.*\)/_\2_\1/
   y/\n_/_\n/

   /\n.*\n/D
   s/.*\n//
' yourfile.csv

結果

A1,B1,C1,D1,E1,F1
G1,H1,I1,J1,K1,L1
A2,B2,C2,D2,E2,F2
G2,H2,I2,J2,K2,L2

答え4

常に尊敬する人がいますrs

rs -c, -T < file.csv | split -l6 --filter='rs -C, -T'
A1,B1,C1,D1,E1,F1,
G1,H1,I1,J1,K1,L1,
A2,B2,C2,D2,E2,F2,
G2,H2,I2,J2,K2,L2,

末尾の区切り文字を削除するにはパイプできます。sed 's/,$//'

rs -c, -T < file.csv | split -l6 --filter='rs -C, -T' | sed 's/,$//'
A1,B1,C1,D1,E1,F1
G1,H1,I1,J1,K1,L1
A2,B2,C2,D2,E2,F2
G2,H2,I2,J2,K2,L2

rsFWIW末尾の区切り文字を追加する理由がわかりません。

-m      Do not trim excess delimiters from the ends of the output array.

これはデフォルト値を表します。しなければならない削除してください。

関連情報