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

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

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

次のようにタブ文字を区切り文字として指定します。

cat myfile | column -t -s"\t"

答え1

列 -t -s '\t'

\列はと文字で区切られていますt

column -s \tcolumn -s 't'シェルはそれを引用演算子として解釈するので、バックスラッシュと同じです。

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

column -ts $'\t'

Ctrl-V Tabシェルプロンプトに入力するか(タブはスペースと同様にシェル構文のトークン区切り文字であるため、引用符の中または前にバックスラッシュが付く)演算子を使用して実際のタブ文字を入力します。"$(printf '\t')"これは、+globに必要な二重引用符の分割を無効にします)タブ文字も$IFSデフォルト値であるためです。

答え2

POSIXでは$'...'定義されていません。つまり、ANSI-Cエスケープです。

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

column -t -s "$(printf '\t')"

$(printf '\011')011(10進数9の8進数表現)は、水平タブ文字のANSIコードであるため機能します。

column -t -s "$(printf '\011')"

しかし、今回のレビューではそうしないことをお勧めします。そしてStéphane Chazelasの答え。これは、POSIX が指定しないため、シェルバージョン間で一貫性がない可能性があるためです。コーディングTABの値は次のとおりです。 CロケールエンコーディングがEBCDICに基づくPOSIXシステムがまだあります。ここで、TABはASCIIのように9ではなく5です。\tこの問題を回避するには、可能な限り名前(ここ)で文字を引用するのが最善です。$'...'2018年9月10日より、POSIX仕様の次のメジャーバージョンに含まれる予定です。

答え3

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

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

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

(何も見えなかったのでこれをしました。スティーブンの答え箱から取り出し、魚の殻に入れて準備します。そうでなければ、スティーブンの答えよさそうだね)

答え4

-t希望の列数を選択するために使用されます。このアイテムを空白のままにしても何も変わりません。また、その後ろにスペースが必要なので、-s次のことを試してください。

cat myfile | column -s \t

関連情報