여러 열이 있고 헤더가 없는 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
awk
Gnu를 사용하는 경우 또 다른 접근 방식 datamash
은 ,
separa -t
또는
datamash transpose -t, < file
5,3,-2,0,2
-3,2,4,2,-1
0,5,4,1,-2
,
그런 다음 파이프를 연결하고 다음 으로 교체할 수 있습니다.\n
tr
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