-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtermTable.awk
179 lines (168 loc) · 5.17 KB
/
termTable.awk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#!/bin/awk -f
##
# ASCII Table Generator from CSV file
# @param int verticalMode, if 1, enable vertical display table
# @param int withFooter if 1, use the last line as footer. Option disabled with verticalMode enabled
# @param int withoutHeader if 1, do not use the first line as header. Option disabled with verticalMode enabled
# @param string addHeader, line to add as header with column's names separated by comma
# @param string replaceHeader, list of no empty value separated by comma overloads the column's names
# @param string columnSeparator, character to separate column, default "|"
# @param string columnBounce, character to bounce separate line, default "+"
# @param string columnBreakLine, character to use as break line, default "-" or "*" in vertical mode
# @param string lineLabel, string to use as suffix of the line number in vertical mode
#
# @copyright 2016 Hervé Gouchet
# @license http://www.apache.org/licenses/LICENSE-2.0
# @source https://github.com/rvflash/termtables
BEGIN {
# Separators (input)
FS=",";
# Separators (output)
if ("" == columnSeparator) {
columnSeparator="|";
}
if ("" == columnBounce) {
columnBounce="+";
}
if ("" == columnBreakLine) {
if (1 != verticalMode) {
columnBreakLine="-";
} else {
columnBreakLine="*";
}
}
if ("" == lineLabel) {
lineLabel=". row";
}
# Manage empty input file
lines[1,1]="";
numberRows=0;
numberFields=0;
columnMaxSizes[1]=0;
headerMaxSize=0;
# Add header
if ("" != addHeader) {
numberFields=splitLine(addHeader, columns);
addRow(columns);
}
}
{
numberFields=splitLine($0, columns);
if (1 == NR && "" != replaceHeader) {
# Replace some or all column names
numberColumnNames=splitLine(replaceHeader, columnNames);
for (column=1; column <= numberColumnNames; column++) {
if ("" != columnNames[column]) {
columns[column]=columnNames[column]
}
}
}
addRow(columns);
}
END{
if (0 == numberRows) {
exit 1;
}
for (line=1; line <= numberRows; line++) {
if (1 != verticalMode) {
if ((line == numberRows && 1 == withFooter) || 1 == line) {
rowSeparator(columnMaxSizes);
}
} else if (line > 1) {
verticalRowSeparator(line-1);
}
for (column=1; column <= numberFields; column++) {
if (1 != verticalMode) {
printf("%s %-*s", columnSeparator, (columnMaxSizes[column]-1), lines[line "," column]);
if (column == numberFields) {
printf("%s%s", columnSeparator, RS);
}
} else if (line > 1) {
printf("%*s: %s%s", headerMaxSize, lines[1 "," column], lines[line "," column], RS);
}
}
if (1 != verticalMode && ((1 == line && 1 != withoutHeader) || (line == numberRows && numberRows > 1))) {
rowSeparator(columnMaxSizes);
}
}
}
##
# Add a row to the table
# @param array columns
function addRow (columns)
{
numberRows++;
for (column=1; column <= numberFields; column++) {
columnSize=(length(columns[column])+2)
if (1 == numberRows && headerMaxSize < columnSize) {
# Build header length for vertical mode
headerMaxSize = (columnSize-2);
}
columnMaxSizes[column]=(columnSize > columnMaxSizes[column] ? columnSize : columnMaxSizes[column]);
lines[numberRows "," column]=columns[column];
}
}
##
# Split line and deal with escaping separator within double quotes
# Cheating with CSV file that contains comma inside a quoted field
# @param string line
# @param array columns
# @return int
function splitLine (line, columns)
{
numberColumns=0;
line=line FS;
while(line) {
match(line, / *"[^"]*" *,|[^,]*,/);
field=substr(line, RSTART, RLENGTH);
# Remove extra data
gsub(/^ *"?|"? *,$/, "", field);
numberColumns++;
columns[numberColumns]=field;
# So, next ?
line=substr(line, RLENGTH+1);
}
return numberColumns
}
##
# Repeat a string
# @param string input
# @param int multiplier
# @return string
function stringRepeat (input, multiplier)
{
value="";
if (multiplier > 0) {
pattern="%" multiplier "s";
value=sprintf(pattern, "");
gsub(/ /, input, value);
}
return value;
}
##
# Print the separator line
# @param array columnSizes
# @return string
function rowSeparator (columnSizes)
{
if (1 == withoutFooter) {
return;
}
columnsNb=length(columnSizes);
for (column=1; column <= columnsNb; column++) {
printf("%s%s", columnBounce, stringRepeat(columnBreakLine, columnSizes[column]));
}
printf("%s%s", columnBounce, RS);
}
##
# Print the separator line dedicated to vertical mode
# @param int lineNumber
# @return string
function verticalRowSeparator (lineNumber)
{
if (1 == withoutFooter) {
return;
}
verticalLineSeparator=stringRepeat(columnBreakLine, 28);
printf("%s %d%s %s%s", verticalLineSeparator, lineNumber, lineLabel, verticalLineSeparator, RS);
}