連続する区切り文字の空の列を含むテーブルを印刷します

連続する区切り文字の空の列を含むテーブルを印刷します

私は通常、column入力をテーブルに変換するために使用します。例:

$ echo 'a\tb\tc\nd\te\tf' | column -t -s $'\t'
a  b  c
d  e  f

ただし、空の列は折りたたまれます。例:

$ echo 'a\tb\tc\nd\t\tf' | column -t -s $'\t'
a  b  c
d  f

連続した区切り文字がある場合に空の列を印刷するのではなく、以下を使用するか、columnまたは他の方法で、私が望むものは次のとおりです。

a  b  c
d     f

答え1

使用する場合GNU column

-n
デフォルトでは、column コマンドは -t オプションを使用すると複数の隣接する区切り文字を 1 つの区切り文字に結合しますが、このオプションはその動作を無効にします。このオプションは Debian GNU/Linux 拡張機能です。

printf 'a\tb\tc\nd\t\tf\n'  | column -t -n -s $'\t'

出力:

a  b  c
d     f

が利用できない場合は、 sed を使用してタブの間にGNU columnスペース (または他の文字、たとえば ) を追加できます。-

printf 'a\tb\tc\nd\t\tf\n'  | sed -e ':loop; s/\t\t/\t-\t/; t loop' | column -t -s $'\t'

答え2

私の列コマンド バージョンでは -n オプションが見つからなかったため、sed を使用して修正しました。

echo -e 'a\tb\tc\nd\t\tf' | sed 's/\t\t/\t \t/'| column -t -s $'\t'

答え3

GNU 列がないもの (例: MacOS): 最初と最後の列に注意してください。最初の列が最も長くない場合、シフトが発生します。スクリプト内のループは必要ないようです。次のパイプをお勧めします。| sed $'s/^\t/-\t/;s/\t\t/\t-\t/g;s/\t$/\t-/' | column -t

paste \
<(printf "a\nb\nc") \
<(printf "1\n2\n3\n4444\n5\n6") \
<(printf "d\ne\nf\ng\nh\ni\nj\nijkl\nk\nl") \
<(printf "X") \
\
| sed $'s/^\t/-\t/;s/\t\t/\t-\t/g;s/\t$/\t-/' | column -t
a  1     d     X
b  2     e     -
c  3     f     -
-  4444  g     -
-  5     h     -
-  6     i     -
-  -     j     -
-  -     ijkl  -
-  -     k     -
-  -     l     -

関連情報