列-tに対応するPOSIX

列-tに対応するPOSIX

私は最近POSIXがあるという事実に驚きました。 リスト ユーティリティは含まれていません。 column 便利です。 column4.3BSDで初登場し、とても便利です。 POSIXと同等のものはありますか?


私が変更したい正確なコマンドは次のとおりです。

$もっと見る - ./tmp.txt
1小さな000a
2非常に_非常に_非常に_非常に_長い000b
小型000c 3個
$column-t --./tmp.txt
1小さな000a
2非常に_非常に_非常に_非常に_長い000b
小型000c 3個
$

つまり、タブを展開してよりきれいな列を作成できます。

答え1

POSIXは既存の動作をエンコードすることを好み、既存の動作が満足できない場合に広く採用されていない新機能のみを適用します。最近では、データを表示するために固定幅フォントの書式なしテキストを使用する必要がないため、要件にcolumnなる可能性はほとんどありません。 BSDから派生したBSDとは異なり、prSystem Vやその他の歴史的なユニスには存在しないため、継承はありません。

他のテキストユーティリティと同様に、適切なワークロードを使用してawkとして表現できます。これは最小限にテストされましたcolumn -t。単純な場合(ただ1文字)、awkのオプションは-Fsに似ています。column-s

#!/usr/bin/env awk
{
    if (max_column < NF) max_column = NF;
    for (i = 1; i <= NF; i++) {
        if (width[i] < length($i)) width[i] = length($i);
        data[NR, i] = $i;
    }
}
END {
    for (i = 1; i < max_column; i++) format[i] = sprintf("%%-%ds  ", width[i]);
    format[max_column] = "%s\n";
    for (k = 1; k <= NR; k++) {
        for (i = 1; i <= max_column; i++) printf format[i], data[k, i];
    }
}

答え2

prたくさんのことをしましたcolumn。実際のコマンドラインを指定すると、代替コマンドラインを使用できます。

namepr - 印刷用のテキストファイル変換

まとめ[オプション]...[ファイル]...

印刷用に文書をページまたは列に分割する方法について説明します。

場合によっては、以下を使用できますawk

awk '{printf("%2s %30s %10s", $1, $2, $3);}' file.txt

幅指定子2、30、および10はハードコーディングされているため、入力した値を選択するか、ファイルを2回読み取る必要があります(一度は各列の最大幅を取得し、2番目は入力した値を取得するには)。

答え3

column私が知る限り、POSIXユーティリティセットには直接同等のものはありません。

可能な(安価な)POSIXソリューションは次のとおりです。

$ tr -s ' ' '\n' <<"EOT" | pr -3 -a -t
1   SMALL   000a
2   VERY_VERY_VERY_VERY_LONG    000b
3   SMALL   000c
EOT
1                       SMALL                   000a
2                       VERY_VERY_VERY_VERY_LON 000b
3                       SMALL                   000

コピー/貼り付け後のサンプルデータには、スペースで区切られたフィールドがあります。実際に個別に分離されている場合はTAB使用できますtr '\t' '\n'

もちろん、これはすべての入力行に同じ数のフィールドがあると仮定します。非常に明白な欠点は、熱の大きさが均一で目立つように悪く見えることですcolumn -t

また、上記の例に示すように、pr行に固定長(デフォルトは72文字)を使用し、列の幅に合わないフィールドを切り捨てます。その後、-wページ幅()を適切な値に明示的に設定する必要があります。

関連情報