csv 여러 열을 단일 열로 변환

csv 여러 열을 단일 열로 변환

여러 열이 있고 헤더가 없는 1개의 CSV 데이터가 있습니다.

5,-3,0
3,2,5
-2,4,4
0,2,1
2,-1,-2

그런 다음 첫 번째 열부터 시작하여 단일 열로 바꾸고 싶습니다. 예상 출력은 다음과 같습니다.

 5
 3
-2
 0
 2
-3
 2
 4
 2
-1
 0
 5
 4
 1
-2

이 문제를 해결하는 방법을 아는 사람이 있나요?

내가 한 일은 Excel 수식을 사용하는 것이었습니다. =INDEX($A$1:$C$4,1+INT((ROW(A1)-1)/COLUMNS($A$1:$C$4)),MOD(ROW(A1)-1+COLUMNS($A$1:$C$4),COLUMNS($A$1:$C4))+1)단일 열로 끝나지만 첫 번째 행부터 시작합니다.

스크립트를 사용하는 등 더 빠른 방법을 찾고 있습니다.

답변1

입력 파일이 완전히 크지 않아서(예: 수백만 개의 필드가 있는 수백만 라인) 메모리에 들어갈 수 있다고 가정하고 모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.

$ awk -F',' '
    { for (i=1; i<=NF; i++) a[NR,i]=$i }
    END { for (i=1; i<=NF; i++) for (j=1; j<=NR; j++) print a[j,i] }
' file
5
3
-2
0
2
-3
2
4
2
-1
0
5
4
1
-2

답변2

awkGnu를 사용하는 경우 또 다른 접근 방식 datamash,separa -t또는

datamash transpose -t, < file

5,3,-2,0,2
-3,2,4,2,-1
0,5,4,1,-2

,그런 다음 파이프를 연결하고 다음 으로 교체할 수 있습니다.\ntr

datamash transpose -t, < file | tr ',' '\n'
5
3
-2
0
2
-3
2
4
2
-1
0
5
4
1
-2

답변3

itertools모듈과 그 함수를 사용하여 chain반복자를 연결하고 순차적으로 인쇄할 수 있습니다.

python3 -c '
import sys, itertools as it
fs,rs = ",","\n"
with open(sys.argv[1]) as f:
  L = []
  for l in f:
    F = l.rstrip(rs).split(fs)
    if not len(L):
      L += [[] for i in range(0,len(F))]
    for nc,e in enumerate(F):
      L[nc].append(e)
for x in it.chain(*L): print(x)
' file

산출:-

5
3
-2
0
2
-3
2
4
2
-1
0
5
4
1
-2

관련 정보