カンマ区切りのテキスト行を一部の列を右揃えの列に分割する簡単な方法はありますか?
ボーナスとして数字の形式を指定したいのですが、sedではそれほど難しくありません。
答え1
アッ%42s
私はprintf形式を考えました。始めるための簡単なスクリプトは次のとおりです。句にwidth[i]
正の値を設定すると、BEGIN
列は指定された幅(左揃え)を持ちます。負の場合、width[i]
列はi
右揃えで幅はです-width[i]
。スクリプトは広いフィールドをインテリジェントに扱うわけではなく、後続のすべての列が行の右側に移動します。
awk -F, -vOFS= '
BEGIN {width[1]=-10; width[2]=8;}
{ for (i=1; i<=NF; i++) {$i = sprintf("%*s", width[i], $i)}
print }'
数値フィールドがある場合は、追加フィールドを使用できます。printf形式。
BSDユーティリティがある場合column
(Debianが提供していますが、他のLinuxディストリビューションについてはわかりません。)簡単に使用できますcolumn -t -s ,
。利点は、column
列の幅を自動的に決定することです。しかし、少し後処理で得ることはできますが、複雑さがそれほど価値があるかどうかはわかりません。
Perlですべてを行うことができます。それ滞在施設が役立ちます。
一般的なUNIXツールを使用してテーブルをフォーマットするより強力な方法は次のとおりです。tbl
、これは* roff(manページフォーマッタ)処理テーブルの一部です。ただし、入力をroffに変換する必要があるため、より複雑です。
もう一つの可能なツールはテキストモードブラウザです。w3m、テーブルレンダリングに堪能です。ここで入力をHTMLに変換する必要があります。
答え2
結局私は直接問題を解決しました。代わりにをcolumn
使用してawk
列を生成してください。たとえば、foo.txt に「bar,36,17.34566」形式の行がある場合は、次のようにします。
cat foo.txt | awk -F, '{printf "%-20s %20d %20.2f\n", $1, $2, $3 }'
最初の列は左揃え、残りの2列は右揃え、最後の列の精度は小数点以下2桁、幅20の列を生成します。
答え3
私のパイプライン:
| nl -nrz\
| rev\
| column -t\
| rev\
| cut -d' ' -f2-
- 固定幅プレフィックス列の追加
- 文字列の逆方向文字
- 列を左揃え
- 文字列の逆方向文字
- #1に追加された列を削除します。