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=15
Bashで使用すると、同じ機能が得られます(このトピックを参照)。質問)。自動的にフォーマットできるプログラムはありますか?tabs
ファイルを読み取る前に値を試したくありません。cat
答え1
私は通常column
この目的のためにこのプログラムを使います。このプログラムはbsdmainutils
Debian で次のパッケージで提供されます。
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-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
もう1つの迅速で汚い方法は、ほとんどの* nixシステムにtabs
含まれてインストールされているこのコマンドを使用することです。ncurses
個人的には、私はこのソリューションが非常に高速で簡単にほとんど正しい結果を得ることができるという点で好きです。
@sebastianが提供したタブ区切りファイルの例に基づいています。
速く走る:
tabs 1,20,35,50
完了したら、タブを標準ハードウェアのデフォルト値に復元することをお勧めします。
tabs -8
man tabs
(はい、タブを-8に明示的に設定するのは奇妙だと思います。しかし、これが私が見たすべての端末のハードウェアのデフォルト値であることを読み取ることができる最高のソリューションです。)
より完全なソリューションを構築するには、stty size
ターミナル幅チェックを使用し、可変長フィールドの幅をターミナル幅のパーセンテージとして計算し、アプリケーションで長い列を切り取ることができます。