Для командной оболочки есть ли общая программа, подобная column
, которая имеет возможность выравнивать определенные или все столбцы вправо, если не обнаруживает также числовые поля и делает это автоматически для них?
В противном случае, что может быть наиболее кратким способом с командами обработки текста?
Пример ввода, разделенного пробелами, уже передан через | column -t
:
TVN 20120419 10.08 10.08 9.15 9.6 1630000 9.17 20120419 4.6 83.88 7376600 -0.21858
INTEGERPL 20120419 143.1 148.9 140.3 142.5 2910 138.53 20120405 4.32503 5.55 1642500 1.26158
JSW 20120419 93.55 94.4 91.25 92.7 116000 90.07 20120329 3.86997 8.54 13155770 1.29315
KERNEL 20120419 73.7 74.9 72.9 74.1 56200 71.8 20120404 3.48432 10.71 2819790 1.50892
EUROCASH 20120419 39.49 41.99 39.01 40.73 812000 38.05 20120328 4.85095 20.21 5280548 2.46091
PEKAO 20120419 145.9 147.8 144.0 145.5 292000 140.2 20120404 3.70615 5.48 68858748 2.63889
PKNORLEN 20120419 38.0 38.5 37.25 37.35 1230000 36.26 20120329 4.15476 21.21 104607200 2.65772
Обратите внимание на проблемы с читаемостью esp. где различия между записями на несколько величин (как 2-й последний столбец). Между прочим, форматирование цен, чтобы всегда показывать N десятичных знаков, является проблемой само по себе. Но для этого я использовал awk OFMT="%.4f"
.
awk printf должен уметь это делать. Для получения дополнительной информации вы должны предоставить больше информации о входном и (желательном) выходном формате.
Выравнивание и обнаружение числового поля может быть достигнуто с помощью следующей простой программы awk
.
{
width=10;
separator="|";
for (i=1; i<=NF; i++) {
if (match($i, /[-+]*[0-9]+[\.]*[0-9]*/)) {
printf("%"width"s", $i);
}
else {
printf("%-"width"s", $i);
}
if (i == NF) printf("\n");
else printf("%s", separator);
}
}
Сохранить как column.awk
.
Чтобы проверить, как это работает, попробуйте следующее:
echo "abc -1.2 def 2 3 hij" | awk -f column.awk
Выход:
abc | -1.2|def | 2| 3|hij
В .awk
есть 2 настраиваемых параметра скрипт: