탭이 구분 기호로 있는 텍스트 테이블(예: 기본적으로 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.
tbl
nroff
( 짐작하셨겠지만 ) 테이블 생성을 지원하는 프런트 엔드입니다..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
- 모든 데이터를 읽고,
- 메모리 및/또는 임시 파일에 저장합니다.
- 열 너비를 계산한 다음
- 모든 데이터를 출력합니다.
당신이 가지고 있다면ㅏ 많은데이터가 부족하면 임시 저장 용량 한도가 초과되어 명령이 실패할 수 있습니다. 입력을 더 작은 파일로 나누어 유용한 결과를 얻을 수 있습니다.
경고: 파일에 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 테이블로 형식화하는 데 사용됩니다.