다음과 같은 데이터 세트가 있습니다.
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