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


59

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

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

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

回答:


82
column -t -s '\t'

\t文字を分離します。

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

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

column -ts $'\t'

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


3
私がしなければならなかったcolumn -t -s $'\t'のbashが思うように見えたとして、'\t'両方を意味\ してtますが、$'\t'リテラルのタブを意味します。バッシュ悪臭
-ThorSummoner

POSIX準拠が必要な場合(主が私を助けてくれます)、私の素晴らしい答えに基づいた私の答えをご覧ください!
ニック・ブル

このソリューションは私のために働いた- $'\t'タブを区切り文字にします。しかしawk -F "\t"、タブをawkの区切り文字として使用することはかなり確実です。なぜここでコラムではなく機能するのですか?
マイク

3

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

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

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

(これは、魚の殻の箱から出してすぐに使用できるステファンの答えに何も見られなかったためです。そうでなければ、ステファンの答えは良いようです。)


3

POSIXの場合$'...'、ANSI-Cエスケープとして知られるが定義されていません。

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

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

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

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

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


2
POSIXはTABのエンコーディングが何であるかを指定しないことに注意してください。ASCIIのようなTABが9ではなく5であるCロケールエンコーディングがEBCDICベースのPOSIXシステムがまだあります。可能な限り、名前で文字を参照する方が"$(printf '\t')"、私の答えに示されているようなこの種の問題を回避する方が良いでしょう。$'...'POSIX仕様の次のメジャーバージョンに含める予定であることに注意してください。
ステファンシャゼラス

@StéphaneChazelasは$(printf '\t')POSIXですか?ありがとうございました!
ニック・ブル


@StéphaneChazelasありがとうございました。答えを更新して、非常に役立つヒントを追加しました:)
Nick Bull

2

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

cat myfile | column -s \t


ありがとう。これは私が探しているものに近いものです。ただし、現在はすべての行が1つの行にマージされています。各行を独自の行に保持するにはどうすればよいですか?
カメ

デフォルトでcolumnは、列の前に行を埋めます。興味があるかもしれませんpr
-lurker
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.