결과

결과

행당 약 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

파이썬해결책:

입력 파일 예 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.

이는 기본값을 나타냅니다.~해야 한다삭제하세요.

관련 정보