콘텐츠에 따라 탭을 확장하는 방법은 무엇입니까?

콘텐츠에 따라 탭을 확장하는 방법은 무엇입니까?

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        

물론, 앞의 숫자는 파일을 나란히 "붙여넣기"하는 것을 보여주기 위한 것입니다.

관련 정보