awk TSV 테이블을 그리드 테이블로 변환 [닫기]

awk TSV 테이블을 그리드 테이블로 변환 [닫기]

탭이 구분 기호로 있는 텍스트 테이블(예: 기본적으로 TSV 파일)을 모든 테두리(내부 및 외부)에 줄이 있고 텍스트 줄 바꿈이 있는 그리드 테이블로 변환하고 싶습니다.

아래는 입력입니다

   TrackId         peerId                                             Cause                                     Count
ESS_RSM         pra4.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1401
ESS_RSM         pra5.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1398
ESS_RSM         pra3.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1347
ESS_RSM         pra1.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1412
ESS_RSM         pra2.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1355
ESS_RSM         pra6.pra.pnc100.tpp240.6pppsetwork.prg             40009 Response is not received from server   1416

큰 공백은 탭이고 "서버로부터 응답을 받지 못했습니다"의 공백은 공백입니다. 출력은 다음과 같아야 합니다.

 ┌────────┬────────────────────────────────────────┬────────────────────────────┬────────┐
 │TrackId │ peerId                                 │ Cause                      │ Count  │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra4.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,401 │
 │        │                                        │ received from server       │        │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra5.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,398 │
 │        │                                        │ received from server       │        │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra3.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,347 │
 │        │                                        │ received from server       │        │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra1.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,412 │
 │        │                                        │ received from server       │        │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra2.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,355 │
 │        │                                        │ received from server       │        │
 ├────────┼────────────────────────────────────────┼────────────────────────────┼────────┤
 │ESS_RSM │ pra6.pra.pnc100.tpp240.6pppsetwork.prg │ 40009 Response is not      │  1,416 │
 │        │                                        │ received from server       │        │
 └────────┴────────────────────────────────────────┴────────────────────────────┴────────┘

아니면 어쩌면

TrackId │ peerId                         │ Cause                                │ Count   │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra4.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,401 │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra5.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,398 │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra3.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,347 │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra1.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,412 │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra2.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,355 │
────────┼────────────────────────────────┼──────────────────────────────────────┼─────────┤
        │ pra6.pra.pnc100.tpp240.6pppset │ 40009 Response is not received from  │         │
ESS_RSM │ work.prg                       │ server                               │   1,416 │
────────┴────────────────────────────────┴──────────────────────────────────────┴─────────┘

아래 코드를 시도했지만 출력이 내가 원하는 것과 다릅니다.

awk '{print "<table>"} {print "<tr>"; for(i=1;i<=NF;i++) print "|" $i "|";print "|"} END {PRINT "|"}' file

답변1

일부 오래된 Unix 유틸리티를 사용하여,

#!/bin/sh
{
        printf '%s\n' '' .TS 'allbox;LLLL,LLLR.'
        awk -v sq="'" '
            BEGIN { FS = OFS = "\t"; fmt = "%" sq "d" }
            NR==1 { print }
            NR>1  {
                        print $1, "T{"
                        print          $2
                        print             "T}", "T{"
                        print                        $3
                        print                           "T}", sprintf(fmt, $4)
                  }
            ' "$@"
        printf '%s\n' .TE '.pl 0'
} | tbl | nroff 2> /dev/null

설명하다:

  • nroff고대 유닉스 텍스트 프로세서이다. 예를 들어,
    Lorem ipsum dolor sit amet, consectetur adipiscing elit,
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    Ut enim ad minim veniam,
    quis nostrud exercitation ullamco laboris nisi
    ut aliquip ex ea commodo consequat.
    Duis aute irure dolor in reprehenderit
    in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
    Excepteur sint occaecat cupidatat non proident,
    sunt in culpa qui officia deserunt mollit anim id est laborum.
    
    입력 및 생산
    Lorem  ipsum  dolor sit amet, consectetur adipiscing elit, sed do
    eiusmod tempor incididunt ut labore et dolore magna  aliqua.   Ut
    enim  ad  minim veniam, quis nostrud exercitation ullamco laboris
    nisi ut aliquip ex ea commodo consequat.  Duis aute  irure  dolor
    in  reprehenderit in voluptate velit esse cillum dolore eu fugiat
    nulla pariatur.  Excepteur sint occaecat cupidatat non  proident,
    sunt in culpa qui officia deserunt mollit anim id est laborum.
    
    출력으로.
  • tblnroff( 짐작하셨겠지만 ) 테이블 생성을 지원하는 프런트 엔드입니다.
  • .TS"테이블 시작"입니다.
  • allbox매우 분명합니다. 각 셀 주위에 상자를 그립니다.
  • LLLL이는 첫 번째 행의 모든 ​​셀이 왼쪽 정렬됨을 의미하며, LLLR네 번째 셀이 모든 후속 행에 대해 오른쪽 정렬됨을 의미합니다. 나는 이것이 예제 출력에서 ​​원하는 것이라고 생각합니다.
  • -v sq="'"sq 작은따옴표로 묶인 값으로 이름이 지정된 변수를 만듭니다 . 이는 awk 프로그램에서 작은따옴표를 사용하는 방법 중 하나입니다.GNU Awk 사용자 가이드.
  • FS입력이 TSV이므로 탭으로 설정합니다 . OFS예상대로 탭으로 설정합니다  tbl(기본값).
  • fmt = "%" sq "d"fmt로 설정 하면 천 단위 구분 기호가 있는 정수를 출력하는 %'d데 사용할 수 있습니다 [s]printf . (당신이 보여주었기 때문에 당신이 이것을 원한다고 가정합니다.)
  • 첫 번째 줄(제목)을 수정하지 않고 전달합니다.
  • 다른 모든 라인(데이터)의 경우 텍스트 줄 바꿈을 위해  T{T}마커를 사용합니다. (첫 번째와 네 번째 열에는 짧은 문자열만 포함되어 있으므로 두 번째와 세 번째 열만 필요하다고 가정합니다.) 세 자리마다 쉼표를 삽입하여 값을 인쇄합니다.$2$3$4
  • .TE"테이블의 끝"입니다.
  • .pl페이지 길이입니다. 패치워크죠. 기본적으로 nroff출력은 빈 줄로 채워져 전체 출력이 66줄의 배수가 됩니다. 페이지 길이를 0으로 설정하면 이를 억제할 수 있습니다.
  • 위의 ( printf,  awk 및  printf) 출력은 tbl 및  로 파이프됩니다 nroff.
  • stdout이 합리적임에도 오류 메시지에 문제가 많아서 stderr을 bitbucket으로 보냈습니다. 이상한 결과가 나타나면 가장 먼저 stderr 리디렉션을 제거하고 오류 메시지를 살펴보는 것입니다(비록 그다지 도움이 되지 않을 수도 있음).

지시하다:

  • 위의 코드를 파일에 넣어보세요. 예를 들어 이라고 부르세요 gman.
  • 하다
    $ chmod +x gman
    
    실행 가능하게 만드세요.
  • 데이터가 파일(예: 이름이 지정된 shap)에 있는 경우 다음을 수행하세요.
    $ ./gman shap
    
    출력을 파일로 리디렉션할 수 있습니다.
    $ ./gman shap > grid_table
    
  • 첫 번째 열의 모든 데이터를 얻는다면 이는 실제로 입력 파일에 탭이 없다는 의미입니다(공백만 있음). 공백(공백)을 탭으로 바꾸도록 편집하세요.
  • 데이터베이스 쿼리와 같은 다른 프로그램에서 데이터를 생성/생산하는 경우 다음을 수행할 수 있습니다.
    $ db_query > tmp
    $ ./gman tmp
    
    ( rm tmp다른 작업을 수행하는 데 필요하지 않은 경우 선택 사항) 또는 그냥
    $ db_query | ./gman
    
  • gman파일을 검색 경로의 디렉터리로 이동(또는 복사)하는 경우 간단히 입력하면 됩니다 gman(필요 없음)../). 하나 있다 많은이에 대한 문서가 있으므로 검색하면 쉽게 찾을 수 있습니다.

예를 들어, 질문에 표시된 입력에 대해 다음을 얻습니다.

┌───────────┬─────────────────────────────────┬───────────────┬───────┐
│   TrackId │ peerId                          │ Cause         │ Count │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra4.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,401 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra5.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,398 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra3.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,347 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra1.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,412 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra2.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,355 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
├───────────┼─────────────────────────────────┼───────────────┼───────┤
│ESS_RSM    │ pra6.pra.pnc100.tpp240.6pppset‐ │ 40009     Re‐ │ 1,416 │
│           │ work.prg                        │ sponse is not │       │
│           │                                 │ received from │       │
│           │                                 │ server        │       │
└───────────┴─────────────────────────────────┴───────────────┴───────┘

출력으로. 열(예: 세 번째 열)을 더 넓게 만드는 몇 가지 요령이 있습니다. 알고 싶은 내용을 알려주십시오.

경고: 이 명령을 실행 tbl 하면 nroff

  1. 모든 데이터를 읽고,
  2. 메모리 및/또는 임시 파일에 저장합니다.
  3. 열 너비를 계산한 다음
  4. 모든 데이터를 출력합니다.

당신이 가지고 있다면ㅏ 많은데이터가 부족하면 임시 저장 용량 한도가 초과되어 명령이 실패할 수 있습니다. 입력을 더 작은 파일로 나누어 유용한 결과를 얻을 수 있습니다.

경고: 파일에 T{또는 T}, 또는 마침표(.) 또는 작은따옴표('), 이상한 결과가 나타날 수 있습니다.

답변2

awk '{$1=$1"|";$2=$2"|";$NF="|"$NF}1' input.txt | awk -F\| 'BEGIN{print "<table border=1>"}{gsub("\\|","</td><td>");print"<tr><td>"$0"</td></tr>"}END{print "</table>"}' > output.html

첫 번째 awk는 |로 값을 구분하는 데 사용됩니다.

두 번째 awk는 값을 HTML 테이블로 형식화하는 데 사용됩니다.

관련 정보