タブ区切りの列を出力する簡単なコマンドはありますか?

タブ区切りの列を出力する簡単なコマンドはありますか?

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この目的のためにこのプログラムを使います。このプログラムはbsdmainutilsDebian で次のパッケージで提供されます。

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

これを行うことができるもう1つのツールは次のとおりですtsv-prettyeBayの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

もう1つの迅速で汚い方法は、ほとんどの* nixシステムにtabs含まれてインストールされているこのコマンドを使用することです。ncurses

個人的には、私はこのソリューションが非常に高速で簡単にほとんど正しい結果を得ることができるという点で好きです。

@sebastianが提供したタブ区切りファイルの例に基づいています。

速く走る:

tabs 1,20,35,50

ncursesタブストップ設定を含むサンプルデータ

完了したら、タブを標準ハードウェアのデフォルト値に復元することをお勧めします。

tabs -8

man tabs(はい、タブを-8に明示的に設定するのは奇妙だと思います。しかし、これが私が見たすべての端末のハードウェアのデフォルト値であることを読み取ることができる最高のソリューションです。)

より完全なソリューションを構築するには、stty sizeターミナル幅チェックを使用し、可変長フィールドの幅をターミナル幅のパーセンテージとして計算し、アプリケーションで長い列を切り取ることができます。

関連情報