答え1
POSIXは既存の動作をエンコードすることを好み、既存の動作が満足できない場合に広く採用されていない新機能のみを適用します。最近では、データを表示するために固定幅フォントの書式なしテキストを使用する必要がないため、要件にcolumn
なる可能性はほとんどありません。 BSDから派生したBSDとは異なり、pr
System Vやその他の歴史的なユニスには存在しないため、継承はありません。
他のテキストユーティリティと同様に、適切なワークロードを使用してawkとして表現できます。これは最小限にテストされましたcolumn -t
。単純な場合(ただ1文字)、awkのオプションは-F
sに似ています。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
ページ幅()を適切な値に明示的に設定する必要があります。