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
rs
FWIW末尾の区切り文字を追加する理由がわかりません。
-m Do not trim excess delimiters from the ends of the output array.
これはデフォルト値を表します。しなければならない削除してください。