다음과 같은 줄이 포함된 파일이 있습니다.
title1:A1
title2:A2
title3:A3
title4:A4
title5:A5
title1:B1
title2:B2
title3:B3
title4:B4
title5:B5
title1:C1
title2:C2
title3:C3
title4:C4
title5:C5
title1:D1
title2:D2
title3:D3
title4:D4
title5:D5
이 목표를 어떻게 달성할 수 있나요?
title1 title2 title3 title4
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
답변1
구경하다GNU 데이터 혼합이렇게 사용할 수 있습니다 datamash transpose
. 향후 버전에서는 크로스탭(피벗 테이블)도 지원할 예정입니다.
답변2
명령줄에서 행과 열을 바꾸는 사용자 지정 솔루션을 스크롤하는 것 외에 제가 본 유일한 도구는 irony라는 도구입니다.transpose
.
설치하다
안타깝게도 어떤 저장소에도 없으므로 다운로드하여 컴파일해야 합니다. 이는 다른 라이브러리에 대한 종속성이 없으므로 매우 간단합니다. 다음과 같이 할 수 있습니다:
$ gcc transpose.c -o transpose
용법
간단한 텍스트 파일을 쉽게 처리할 수 있습니다. 예를 들어:
$ cat simple.txt
X column1 column2 column3
row1 0 1 2
row2 3 4 5
row3 6 7 8
row4 9 10 11
다음 명령을 사용하여 조옮김을 수행할 수 있습니다.
$ transpose -t --fsep " " simple.txt
X row1 row2 row3 row4
column1 0 3 6 9
column2 1 4 7 10
column3 2 5 8 11
명령은 transpose
전치( -t
)이며, 사용되는 필드 구분 기호는 공백( --fsep " "
)입니다.
당신의 모범
예제 데이터는 약간 더 복잡한 형식이므로 두 단계로 처리해야 합니다. 먼저 이를 transpose
처리할 수 있는 형식 으로 변환해야 합니다 .
이 명령을 실행하면 데이터가 보다 수평적으로 친숙한 형식으로 변환됩니다.
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - -
title1 A1 title1 B1 title1 C1 title1 D1 title2 A2
title2 B2 title2 C2 title2 D2 title3 A3 title3 B3
title3 C3 title3 D3 title4 A4 title4 B4 title4 C4
title4 D4 title5 A5 title5 B5 title5 C5 title5 D5
이제 title1, title2 등의 두 번째 항목만 삭제하면 됩니다.
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - - | sed 's/\ttitle[0-9] / /g'
title1 A1 B1 C1 D1 A2
title2 B2 C2 D2 A3 B3
title3 C3 D3 A4 B4 C4
title4 D4 A5 B5 C5 D5
transpose
이제는 처리 가능한 형식입니다. 다음 명령은 전체 전치를 완료합니다.
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - - | sed 's/\ttitle[0-9] / /g' \
| transpose -t --fsep " "
title1 title2 title3 title4
A1 B2 C3 D4
B1 C2 D3 A5
C1 D2 A4 B5
D1 A3 B4 C5
A2 B3 C4 D5
답변3
파일을 원하는 형식으로 변환하는 빠른 방법은 다음과 같습니다.
$ grep -Ev "^$|title5" sample.txt | sed 's/title[0-9]://g' | paste - - - -
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
열 헤더를 원하는 경우:
$ grep -Ev "^$|title5" sample.txt | sed 's/:.*//' | sort -u | tr '\n' '\t'; \
echo ""; \
grep -Ev "^$|title5" a | sed 's/title[0-9]://g' | paste - - - -
title1 title2 title3 title4
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
두 번째 명령의 작동 방식
배너 인쇄grep -Ev "^$|title5" sample.txt | sed 's/:.*//' | sort -u | tr '\n' '\t';
배너 뒤에 캐리지 리턴 추가
echo
데이터 라인 인쇄
grep -Ev "^$|title5" a | sed 's/title[0-9]://g' | paste - - - -
답변4
GNU 데이터매시 유틸리티
apt install datamash
datamash transpose < yourfile
해당 홈페이지에서 발췌,https://www.gnu.org/software/datamash/그리고 http://www.thelinuxrain.com/articles/transpose-rows-and-columns-3-methods