列データ設定時の数値列の並べ替え

列データ設定時の数値列の並べ替え

私は使うcolumn -tデータはシェルで見やすくなるようにフォーマットされていますが、列の並べ替え(右揃えなど)を指定するオプションはないようです。

これを行うことができるBash Quipはありますか?私はたくさんの列を持っています。

答え1

最新バージョンにはcolumnあるようです。右揃えオプションいくつかの列:

   -R, --table-right columns
          Right align text in the specified columns.

例:

$ echo -e "a 1 2\nb 12345 678.90" | column -t -R 2,3
a      1       2
b  12345  678.90

いつものように、RHEL / Centosは絶望的に古く、util-linuxRHEL / Centos 7または8ではこのオプションはまだ利用できません(パッケージ)。

答え2

簡単な観点から、私awk

column -t filename | awk '{for (i=0; i<NF; i++){l=index($0, $i)+1;printf "%*s ", index($0, $(i+1))-l, $i}printf "%*s\n", index($0, $NF)-l, $NF}'

これにより少し広がります

答え3

更新:ソートする列を選択できるスクリプト(1行ではない)を追加しました。左(デフォルト)と右(中央ではない)に合います。現状のままタブ区切りフィールドが必要です。列出力区切り記号は、次のように変更できます。$S

RJustCol=(2 3 5)  # Set columns to be right justified.
RJustRex=; Q=$'\x01'; R=$'\x02'; S=" | "
for r in ${RJustCol[@]} ;do  # Build the Right-justify regex.
  RJustRex="${RJustRex}s/^(([^\t]+\t){$((r-1))})([^\t]+)\t/\1\3$R\t/; "
done
sed -r "s/$/\tZ/g; s/^/$Q/; s/\t/\t$Q/g; $RJustRex" file |
  column -t -s $'\t' | 
    sed -r "s/  $Q/$Q/g; s/$Q([^$Q$R]*)$R([^$Q]*)/$S\2\1/g; s/$Q/$S/g; s/Z$//"

一般的な出力:

| The Lost Art       |   +1255 |  789 | Los                 |     -55 | 
| of the Idle Moment | -159900 | 0123 | Fabulosos Cadillacs | +321987 | 

注:columnセルが空の場合、期待どおりに機能しません。

Option -n
        By default, the column command will merge multiple adjacent
        delimiters into a single delimiter when using the --t option;
        this option disables that behavior. This option is a Debian
        GNU/Linux extension.

ここから始めるのは、質問に関連していますが、質問の主な問題を具体的に扱わない元の答えです。

これは整数に合う(そして+/-記号を受け入れる)「行」です。 「X」プレースホルダーはcolumn最後のセルを正しく埋めるようにします。

sed 's/$/\tX/g' file |column -t |sed -r 's/([-+]?[0-9.]+)( +)/\2\1/g; s/^  //; s/X$//'

一般的な出力

  +1255  789  011      -55       34
-159900   33  022  +321987  2323566

浮動小数点値、整数と混合された浮動小数点、または整数(オプションの前の+/-記号)がある場合は、より多くの順序を混在させることができます。

sed -r 's/$/\tX/; 
        s/([-+]?[0-9]+\.[0-9]+)\t/\1@\t/g
        s/([-+]?[0-9]+)\t/\1.@\t/g
        s/\./\t./g' file |
  column -t |
    sed -r 's/  \././g
            s/([-+]?[0-9.]+)( +)/\2\1/g
            s/\.@/ /g
            s/@//g
            s/ +X$//'

一般的な出力

+1255       789   0.11   -55           34
  -15.9900   33   0.22  +321.987  2323566

関連情報