我有以下内容可以根据 csv 文件的最长行打印虚线:
awk -F ',' '
BEGIN {
longest_line=0
for (i = 1; i <= NF; i++) {
longest[i] = ""
}
}
{
for (i = 1; i <= NF; i++) {
if (length($i) > length(longest[i])) {
longest[i] = $i
}
}
}
END {
for (i=1; i<=NF;i++) {
longest_line += length(longest[i])
}
printf("%*s", longest_line, "=")
}
'
这是整个脚本:
awk -F ',' -v smso="$smso" -v rmso="$rmso" 'BEGIN {
count=1
firstcol=0
arraylen=1
longest_line=0
for (i = 1; i <= NF; i++) {
longest[i] = ""
}
}
{
for (i=1;i<=NF;i++) {
if (i==NF) {
data[arraylen++]=$i
data[arraylen++]="\n"
} else {
data[arraylen++]=$i
}
}
}
{
for (i = 1; i <= NF; i++) {
if (length($i) > length(longest[i])) {
longest[i] = $i
}
}
}
END {
for (i=1; i<=NF;i++) {
longest_line += length(longest[i])
}
printf("%*s", longest_line, "b")
for (i = 1; i <= length(data); i++) {
if (data[i]=="\n") {
firstcol++
count=1
printf("%s", data[i])
} else if (count==1 && i != 1) {
printf("%s%s%s", "|", data[i], "|")
count++
} else {
smso=$(tput smso)
rmso=$(tput rmso)
num_spaces=(length(longest[count])-length(data[i]))+1
printf("%s%*s%s%s", (i==1?"|":""), (i==1?num_spaces-1:num_spaces), " ", firstcol==0?toupper(data[i]):data[i], "|")
count++
}
}
}'
输入文件是:
NUMBER,FNAME,LNAME,PHONE-TYPE:GROUPS
222-222-2222,Elizabeth,Taylor,office:beauty:
111-111-1111,Matt,Alex,personal:superhuman:cool:amazing:extra
期望的输出是:
==============================================================
| NUMBER| FNAME| LNAME| PHONE-TYPE:GROUPS|
|222-222-2222| Elizabeth| Taylor| office:beauty:|
|111-111-1111| Matt| Alex| personal:cool:amazing:extra|
但我的输出是:
=
| NUMBER| FNAME| LNAME| PHONE-TYPE:GROUPS|
|222-222-2222| Elizabeth| Taylor| office:beauty:|
|111-111-1111| Matt| Alex| personal:cool:amazing:extra|
sprintf("%*s", n, string)
将字符串左填充到带有 空格awk
的长度(字节数或字符数,具体取决于实现)。n
要重复一个字符串 n 次,您可以编写一个辅助函数:
在这里,我建议使用
mlr
which 来做到这一点(或类似的东西)开箱即用(并正确处理 CSV):或者对于右对齐字段:
如果
mlr
不可用,awk
我会使用perl
已很大程度上取代 的,而不是awk
。这使:
标题为粗体和蓝色。
在 中
perl
,重复字符串是通过x
重复运算符完成的:"string" x 3
结果为stringstringstring
。perldoc perlop
详情请参阅。尽管
perl
您很少需要重新发明轮子,因为它已经存在了 35 年,但 Perl 模块已经可以用于任何用途。我们已经使用该List::Util
模块提供了一些有用的列表操作函数并Term::ANSIColor
输出上面的彩色文本,但还有一个Text::CSV
模块可以处理 CSV 和Text::ASCIITable
格式化表格:打印一个
=
由空格缩进的字符longest_line-1
。你想要这个:FWIW,这就是我使用任何 awk 编写代码来执行您似乎想要执行的操作的方式:
val = $colNr
通过更改为val = " " $colNr " "
或类似内容,根据您认为合适的情况用空格填充一些字段。