행 형식 데이터를 열 형식으로 변환

행 형식 데이터를 열 형식으로 변환

다음과 같은 데이터 세트가 있습니다.

Name:      Jim Bean
Vice:      Dice
ID:        AFDSDFDSFDSFASFA
LoginTime: 12343314

Name:      Bob Dylon
Vice:      Trumpets
ID:        AFD232SFDSFASFA
LoginTime: 12343314

Name:      Mary Jane
Vice:      Gambling
ID:        EWDSFDSFASFA
LoginTime: 12343314

.....

컬럼 형식으로 정리해야 합니다. 내 첫 번째 생각은 .을 사용하는 것이었지만 awk조금 막혔습니다.

레이블은 항상 동일한 순서로 표시되며 각 그룹에는 항상 동일한 수의 레이블/값 쌍이 표시됩니다(제목은 중요하지 않음).

내 질문은: 어떻게 해야 합니까?

이 명령이 비슷한 작업을 수행할 수 있다는 힌트를 본 적이 있지만 rs모든 시스템에서 표준은 아닙니다.

답변1

질문과 함께 필요한 출력을 게시해야 합니다. 내 추측은 이렇습니다.

$ awk '{ if($2) printf("%s ", $2); else print ""; }' < dataset
Jim Dice AFDSDFDSFDSFASFA 12343314 
Bob Trumpets AFD232SFDSFASFA 12343314 
Mary Gambling EWDSFDSFASFA 12343314

이것은 매우 어리석은 접근 방식이므로 아무것도 검증하지 않습니다. 입력한 내용이 게시한 내용과 다른 경우 충돌이 발생할 수 있습니다.

답변2

RS와 FS 사용에 주의하면서 GNU awk를 사용하여 이 작업을 수행할 수 있습니다.

<infile awk '{ print $2, $4, $6, $8 }' RS='\n\n' FS=': +|\n' OFS='\t'

헤더를 유지하려면 다음을 수행하십시오.

<infile awk 'NR==1 { print $1, $3, $5, $7 } { print $2, $4, $6, $8 }' RS='\n\n' FS=': +|\n' OFS='\t'

모든 레코드의 형식이 다음과 같다고 가정하면 coreutils를 사용하여 다음을 수행할 수 있습니다.

<infile grep -v '^$' | tr -s ' ' | cut -d' ' -f2- | paste - - - -

산출:

Jim Bean    Dice    AFDSDFDSFDSFASFA    12343314
Bob Dylon   Trumpets    AFD232SFDSFASFA 12343314
Mary Jane   Gambling    EWDSFDSFASFA    12343314

제목이 있는 출력:

Name    Vice    ID      LoginTime
Jim Bean        Dice    AFDSDFDSFDSFASFA        12343314
Bob Dylon       Trumpets        AFD232SFDSFASFA 12343314
Mary Jane       Gambling        EWDSFDSFASFA    12343314

관련 정보