탭으로 구분된 열을 출력하는 간단한 명령이 있습니까?

탭으로 구분된 열을 출력하는 간단한 명령이 있습니까?

echo -e "var1\tvar2\t\var3\tvar4" > foo예를 들어, 출력이 포함된 파일( 로 생성됨)이 있습니다 .

$ cat foo
case    elems   meshing nlsys
uniform 2350    0.076662        2.78
non-conformal   348     0.013332        0.55
scale   318     0.013333        0.44
smarter 504     0.016666        0.64
submodel        360     .009999 0.40
unstruct-quad   640     0.019999        0.80
unstruct-tri    1484    0.01    0.88

vim나는 다음과 같은 출력을 선호합니다(여기서는 sum 을 사용합니다 :set tabstop=14).

case          elems         meshing       nlsys
uniform       2350          0.076662      2.78
non-conformal 348           0.013332      0.55
scale         318           0.013333      0.44
smarter       504           0.016666      0.64
submodel      360           .009999       0.40
unstruct-quad 640           0.019999      0.80
unstruct-tri  1484          0.01          0.88

cat$ tabs=15Bash에서 사용 하면 동일한 기능을 얻을 수 있습니다(이 항목 참조).질문). 자동으로 포맷을 할 수 있는 프로그램이 있나요? tabs파일을 읽기 전에 값을 시험해보고 싶지 않습니다 .cat

답변1

나는 보통 column이 목적으로 이 프로그램을 사용합니다. 이 프로그램은 bsdmainutils데비안에서 다음과 같은 패키지로 제공됩니다.

column -t foo

산출:

case           elems  meshing   nlsys
uniform        2350   0.076662  2.78
non-conformal  348    0.013332  0.55
scale          318    0.013333  0.44
smarter        504    0.016666  0.64
submodel       360    .009999   0.40
unstruct-quad  640    0.019999  0.80
unstruct-tri   1484   0.01      0.88

column(1)내 시스템 에서 가져온 내용 :

...

-t      Determine the number of columns the input contains and create a
        table.  Columns are delimited with whitespace, by default, or
        with the characters supplied using the -s option.  Useful for
        pretty-printing displays.

...

답변2

여러 옵션:

var1=uniform var2=2350 var3=0.076662 var4=2.78

printf '%-15s %-10s %-12s %s\n' \
  case elems messing nlsys \
  "$var1" "$var2" "$var3" "$var4"

printf '%s\t%s\t%s\t%s\n' \
  case elems messing nlsys \
  "$var1" "$var2" "$var3" "$var4" |
  expand -t 15,25,37

printf '%s\t%s\t%s\t%s\n' \
  case elems messing nlsys \
  "$var1" "$var2" "$var3" "$var4" |
  column -t -s $'\t'

열은 비표준 명령이며 일부 구현/버전은 -s 옵션을 지원하지 않습니다. 입력을 기준으로 열 너비를 계산하지만 이는 모든 입력이 입력될 때까지 표시를 시작할 수 없음을 의미합니다. $'...'ksh93 구문을 zsh 및 bash에서도 사용할 수 있습니까?

zsh 사용:

values=(
  case elems messing nlsys
  "$var1" "$var2" "$var3" "$var4"
)
print -arC4 -- "$values[@]"

답변3

이를 수행할 수 있는 또 다른 도구는 tsv-pretty다음에서 제공됩니다.eBay의 TSV 유틸리티(면책조항: 저는 저자입니다). 소수점에 숫자 필드를 정렬하려면 추가 단계가 필요합니다. 예를 들어:

$ tsv-pretty foo
case           elems   meshing  nlsys
uniform         2350  0.076662   2.78
non-conformal    348  0.013332   0.55
scale            318  0.013333   0.44
smarter          504  0.016666   0.64
submodel         360   .009999   0.40
unstruct-quad    640  0.019999   0.80
unstruct-tri    1484  0.01       0.88

여러 가지 서식 옵션이 있습니다. 예를 들어 -u제목에 밑줄을 추가하고 -f필드의 부동 소수점 숫자 형식을 유사하게 지정하여 가독성을 높입니다.

$ tsv-pretty foo -f -u
case           elems   meshing  nlsys
----           -----   -------  -----
uniform         2350  0.076662   2.78
non-conformal    348  0.013332   0.55
scale            318  0.013333   0.44
smarter          504  0.016666   0.64
submodel         360  0.009999   0.40
unstruct-quad    640  0.019999   0.80
unstruct-tri    1484  0.010000   0.88

더 많은 정보를 원하시면 방문해주세요tsv - 예쁜 참고자료.

답변4

또 다른 빠르고 더러운 방법은 대부분의 *nix 시스템에 tabs포함되어 설치되는 이 명령을 사용하는 것입니다 .ncurses

개인적으로 저는 이 솔루션이 매우 빠르고 쉽게 대부분 올바른 결과를 얻을 수 있다는 점에서 좋아합니다.

@sebastian이 제공한 탭으로 구분된 파일 예제를 기반으로 합니다.

빨리 달려:

tabs 1,20,35,50

ncurses 탭스톱 설정이 포함된 샘플 데이터

완료되면 탭을 표준 하드웨어 기본값으로 복원하는 것이 좋습니다.

tabs -8

man tabs(예, 탭을 -8로 명시적으로 설정하는 것이 이상하다고 생각합니다. 그러나 이것이 제가 본 모든 터미널의 하드웨어 기본값이라는 내용을 읽고 얻을 수 있는 최고의 솔루션입니다 .)

보다 완전한 솔루션을 구축하려면 stty size터미널 너비 확인을 사용하고 가변 길이 필드의 너비를 터미널 너비의 백분율로 계산하고 애플리케이션 방식으로 긴 열을 잘라낼 수 있습니다.

관련 정보