열을 열당 여러 값이 있는 행으로 변환하는 방법은 무엇입니까?

열을 열당 여러 값이 있는 행으로 변환하는 방법은 무엇입니까?

다음과 같은 데이터가 포함된 파일이 있습니다.

1,2,3 4,5,6 7,8,9 12,22,0

나는 4개의 열이 있는 테이블을 만들고 싶습니다 a,b,c,d. 이 열에는 a첫 번째 열의 값이 있고 b두 번째 열에는 해당 값이 있습니다.

위의 예에서 열은 다음과 같습니다.

a   b   c   d
1   4   7   12
2   5   8   22
3   6   9   0

남은 거 아무거나. 특정 행의 열에 있는 항목은 동일합니다. 그러나 이러한 항목은 행마다 다를 수 있습니다. 예를 들어 일부 행에는 열당 쉼표로 구분된 항목이 1개만 있을 수 있고 일부 행에는 10개가 있을 수도 있습니다.

답변1

열 이름 지정 방법(사용자 입력, 사용할 각 열에 대해 미리 정의된 이름 등)이 명확하지 않습니다.

문자열을 열로 분할하려면 다음을 사용할 수 있습니다 sed.

echo 1,2,3 4,5,6 7,8,9 12,22,0 | sed -n 'h;:a;g;s/,[^ ]*//gp;g;s/^[^, ]*,//;s/ [^,]*,/ /g;h;ta;p'

여기에서는 sed전체 문자열을 버퍼에 복사하고( ) h루프 의 줄을 반복하고( :a.. ) 버퍼에서 복사된 문자열을 가져오고() 각 부분에서 첫 번째 숫자를 가져와(first ) 인쇄합니다( ). 변경되지 않은 문자열을 다시 검색하고 첫 번째 숫자(두 번째 및 세 번째 )를 제거한 다음 수정된 문자열을 다시 버퍼( )에 넣습니다. 이는 문자열 상태 에 있을 때에도 계속됩니다. 일단 사라지면 남은 것을 인쇄합니다 .tagspsh,p

답변2

필요한 작업을 수행할 수 있습니다.

 $ sed -Ee '
     s/^/ /;y/ /\n/
     :loop
        s/(\n.*)\n([^,]*),/\2 \1 /
     tloop
     s/(.*) \n([^,]*),/\2 \1\n/
     P;/,/D;s/.*\n//
 ' inp

다음 접근 방식은 각 열에서 선행 열 요소를 선택하여 인쇄할 행의 모양을 지정하는 것입니다.

또 다른 접근 방식은 쉼표 분할을 기반으로 열을 배열로 분할하는 것입니다. 그런 다음 하위 배열의 요소가 부족할 때까지 선행 요소를 이동합니다. 행당 번호가 동일하기 때문입니다.

 $ perl -lane '$,=" ";
    my @A = map { [split /,/] } @F;
    print map { shift @$_ } @A while @{$A[0]};
 ' inp 

관련 정보