web-dev-qa-db-ja.com

列を使用してスペースではなくタブを区切るにはどうすればよいですか?

Unixのcolumnコマンドを使用して、テキストをフォーマットします。タブで区切られたフィールドがありますが、各フィールド内にはスペースもあります。 columnは、空白(タブとスペース)で区切ります。列を区切り文字としてタブのみを使用するにはどうすればよいですか?

私はタブを区切り文字として指定しようとしていました:

cat myfile | column -t -s"\t"
67
turtle
_column -t -s '\t'
_

_\_およびt文字で列を区切ります。

_column -s \t_は、バックスラッシュがシェルによって引用演算子として解釈されるため、_column -s t_と同じです。

ここでは、実際のタブ文字を列に渡します。 ksh93、zsh、bash、mksh、busybox shまたはFreeBSD shの場合:

_column -ts $'\t'
_

または、実際のタブ文字を入力して入力します Ctrl-VTab シェルプロンプトで(引用符内またはバックスラッシュを前に付けたタブ文字はスペースと同様にシェル構文のトークンセパレーターであるため)、または"$(printf '\t')"(split + glob演算子を無効にするために必要な二重引用符)を使用します。タブ文字もたまたまデフォルト値の_$IFS_)にあるからです。

91

私は以下を使用しました(テキストに|が含まれていない場合にのみ機能します):

cat myfile | tr '\t' '|' | column -t -s '|'

これは単にタブをパイプに置き換え、パイプを含む列を区切り文字として使用します。

(これは、魚の殻ですぐに機能するStéphaneの回答に何も見当たらないためです。それ以外の場合、Stéphaneの回答は良いようです。)

4
Aaron Feldman

POSIXでは、ANSI-Cエスケープと呼ばれる_$'...'_は定義されていません。

代わりに、$(printf '\t')を使用できます。

_column -t -s "$(printf '\t')"
_

_011_(10進数9の8進表記)は水平タブ文字のANSIコードであるため、$(printf '\011')を使用できます。

_column -t -s "$(printf '\011')"
_

ただし、これがシェルのバージョン間で一貫していない可能性がある理由については、StéphaneChazelasの以下の解説を参照してください。

4
Nick Bull

-tは、必要な列数を選択するためのものです。この空白のままにしても何も変わりません。また、-sの後に空白を入れたいので、これを試してください:

cat myfile | column -s \t

2
lurker