쉘 스크립트 출력을 테이블로 형식 지정

쉘 스크립트 출력을 테이블로 형식 지정

일부 논리를 기반으로 일부 데이터를 생성한 다음 일부 조합으로 출력을 표시하는 루프에서 스크립트를 실행하고 있지만, 내가 얻은 출력은 새 줄에 있습니다.

Roll number               : 187437366 
Mobile Number             : 07995036927
Grade                     : A
Roll number               : 187437367 
Mobile Number             : 07995036937
Grade                     : B

하지만 아래와 같이 표 형식으로 출력을 원합니다.

Roll Number | Mobile Number | Grade
187437366   | 07995036927   | A
187437466   | 07995037922   | A2
187437266   | 07995036921   | B
187437766   | 07995036120   | C

이것을 달성하는 방법에 대한 개념을 찾을 수 없습니다. 누구든지 나를 도와줄 수 있습니까?

답변1

awk물론 도구 상자에 이 도구만 있는 것은 아닙니다. 불가피하게 쏟아지는 스크립트의 균형을 맞추기 위해 awk여기에 있습니다.밀러실행 중:

%mlr --ixtab --ips : --opprint 고양이 << END
롤 번호: 187437366
휴대폰 번호 : 07995036927
A 급

롤 번호: 187437367
휴대폰 번호 : 07995036937
학년: B

롤번호 휴대폰 번호 수준
 187437366 07995036927A
 187437367 07995036937B
%

스크립트에서 각 레코드 뒤에 빈 줄을 내보내도록 하거나 이를 수행하기 위해 중간 필터를 추가하면 "XTAB" 입력 형식과 :"쌍 구분 기호" 문자만 있으면 됩니다( --ixtab--ips옵션 참조).

위의 내용은 "PPRINT" 출력 형식입니다. 더 많은 질문과 같은 출력을 위해 --barred"PPRINT" 및 "Markdown" 대체 출력 형식을 선택할 수 있습니다 --omd. 그러나 나는 최신 버전의 Miller를 시연용으로 즉시 제공하지 않았습니다.

답변2

짧막 한 농담:

$ awk -F':' '{printf "%s%s", $2, (/^Grade/)?"\n":"\t|"}' file

산출:

 187437366      | 07995036927   | A
 187437367      | 07995036937   | B

답변3

awk탭 및 구분 기호로 사용 |:

awk -F: '
  BEGIN{ printf "%s\t|%s\t|%s","Roll Number","Mobile Number","Grade"}
  { gsub(/ /,"",$2); printf "%s", ($1 ~ "^Roll" ? RS : "\t|") $2 }
  END { print "" }
' file

블록 내에서 탭을 사용하고 BEGIN각 필드 사이에 제목을 인쇄하세요. 그런 다음 두 번째 필드(선행 및 후행)에서 모든 공백 문자를 제거하고|

  1. 첫 번째 필드가 로 시작하는 경우 Roll레코드 구분 기호 RS(개행)를 추가하고, 그렇지 않으면 탭 및|
  2. 두 번째 필드 인쇄

END블록 내에서 또 다른 개행 문자를 인쇄합니다.

산출:

Roll Number     |Mobile Number  |Grade
187437366       |07995036927    |A
187437367       |07995036937    |B

답변4

코드를 입력 파일의 데이터 값에 연결하는 대신 반복되는 헤더 값에만 의존하십시오.

$ cat tst.awk
BEGIN {
    FS = "[[:space:]]*:[[:space:]]*"
    OFS = "|"
}
seen[$1]++ { prt() }
{
    hdrs[++numFlds] = $1
    vals[numFlds] = $2
}
END { prt() }

function prt(   fldNr) {
    if ( !doneHdr++ ) {
        for (fldNr=1; fldNr<=numFlds; fldNr++) {
            printf "%s%s", hdrs[fldNr], (fldNr<numFlds ? OFS : ORS)
        }
    }
    for (fldNr=1; fldNr<=numFlds; fldNr++) {
        printf "%s%s", vals[fldNr], (fldNr<numFlds ? OFS : ORS)
    }
    numFlds = 0
    delete seen
}

.

$ awk -f tst.awk file | column -s'|' -o' | ' -t
Roll number | Mobile Number | Grade
187437366   | 07995036927   | A
187437367   | 07995036937   | B

관련 정보