행과 열 바꾸기

행과 열 바꾸기

다음과 같은 줄이 포함된 파일이 있습니다.

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

관련 정보