Unix 파이프에서 탭으로 구분된 데이터를 얻었습니다. 이 데이터를 사람이 읽을 수 있는 간단한 테이블로 포맷하고 싶습니다.
이러한 탭을 공백으로 확장하고 필드 데이터의 너비에 따라 탭 정지를 자동으로 설정하려면 어떻게 해야 합니까?
예를 들어, 내 가상 스크립트는 다음을 생성할 수 있습니다( 실제 탭 문자를 나타내는 generate_tsv
데 사용함 ).\t
alpha\t1\t0.21085026\tok
beta\t4096\t0.0\tok
gamma\t\t-1.0\tinvalid
을 사용하면 | expand -t 12
다음을 얻습니다.
alpha 1 0.21085026 ok
beta 4096 0.0 ok
gamma -1.0 invalid
그러나 나는 다음과 같이 좀 더 컴팩트한 것을 원합니다(따라서 열을 구분하는 두 개의 공백이 있음).
alpha 1 0.21085026 ok
beta 4096 0.0 ok
gamma -1.0 invalid
@jw013이 제안한 것처럼 | column -t -s $'\t'
가깝지만 빈 셀을 축소하므로 정확하지는 않습니다.
alpha 1 0.21085026 ok
beta 4096 0.0 ok
gamma -1.0 invalid
답변1
column(1)
오래된 BSD 도구가 있다면 이를 사용해 column -t
예쁜 테이블을 인쇄해 보세요.
빈 셀이 표시되도록 하려면 각 빈 셀에 공백을 삽입하는 방법을 시도해 볼 수 있습니다(두 개의 연속 탭으로 식별 가능). 아이디어는 column(1)
공백 문자에 자체 열이 제공되어야 하지만 너비가 단일 문자이므로 테이블 크기에 영향을 미치거나 출력에서 사람에게 표시되어서는 안 된다는 것입니다.
generate_tsv |
awk '/\t\t/ { for (i = 0; i < 2; i++) gsub(/\t\t/, "\t \t") } 1' |
column -t -s $'\t'
위에서 설명한 것처럼 파이프에 삽입된 추가 콘텐츠는 awk
모든 빈 셀에 공백을 삽입합니다. 2개의 연속된 빈 셀( )을 처리하려면 2번의 패스가 필요합니다 \t\t\t
.
답변2
우회적인 방식이지만 작동하며 빈 행과 빈 셀을 고려하여 테이블을 만듭니다 column
. 여러 파일을 나란히 결합할 수 있습니다. 예를 들어. 접두사 줄
"F1"행"니오브"
빈 줄은 빈 셀로 표시됩니다(여러 파일 붙여넣기의 경우).
파일의 길이는 다를 수 있습니다.
# Make test data file
echo -e "alpha\t1\t0.21085026\tok
beta\t4096\t0.0\tnext F1 line is blank
gamma\t\t-1.0\tinvalid" >F1
sed -n '=' F1 >Nb
echo -e "\tB\tC\textra F1 line" >>F1
# Set the positional parameters $1, $2
set Nb F1
{ echo -e "<html>\n<table border=1 cellpadding=0 cellspacing=0>"
paste "$@" |sed -e 's#\(.*\)#\x09\1\x09#
s#\x09# </pre></td>\n<td><pre> #g
s#^ </pre></td>#<tr>#
s#\n<td><pre> $#\n</tr>#'
echo -e "</table>\n</html>"
}|w3m -dump -T 'text/html'
출력의 테이블 버전:
┌───┬───────┬──────┬────────────┬───────────────────────┐
│ 1 │ alpha │ 1 │ 0.21085026 │ ok │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 2 │ beta │ 4096 │ 0.0 │ next F1 line is blank │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 3 │ │ │ │ │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 4 │ gamma │ │ -1.0 │ invalid │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ │ │ B │ C │ extra F1 line │
└───┴───────┴──────┴────────────┴───────────────────────┘
프레임 없는 버전을 얻으려면 프레임을 제거하기만 하면 됩니다. 이는 다음 코드 줄에 표시된 대로 출력을 추가로 파이핑하여 쉽게 수행할 수 있습니다.대안위 테이블 버전의 마지막 행에 해당합니다.
# the replacement "new" last line
}|w3m -dump -T 'text/html' |sed -r '/^┌|├|└/d; s/^│ //g; s/ │$//g; s/ │ /│/g'
"새" 출력은 다음과 같습니다. 수직 구분 기호를 제자리에 유지했습니다. 필요하지 않다면 마지막 sed 표현식을 원하는 대로 변경하세요.
1│alpha│1 │0.21085026│ok
2│beta │4096│0.0 │next F1 line is blank
3│ │ │ │
4│gamma│ │-1.0 │invalid
│ │B │C │extra F1 line
또는 다음과 같이 (2개의 공백) / │ /
으로 바꾸십시오./ /
1 alpha 1 0.21085026 ok
2 beta 4096 0.0 next F1 line is blank
3
4 gamma -1.0 invalid
B C extra F1 line
물론, 앞의 숫자는 파일을 나란히 "붙여넣기"하는 것을 보여주기 위한 것입니다.