我已经能够找到grep
没问题但是分配基本上是将数据拉出并格式化并将其显示为具有多行的表列。现在它不应该是任何疯狂的因为我们只有awk
和sed
的基本知识。现在我很好奇:有没有办法从grep
获取输出并格式化,例如我得到:
Jake
0001
Bob
0002
Kim
0003
并想要做到这样的事情
# Name LD #
--- ---- ----
1 Jake 0001
2 Bob 0002
3 Kim 0003
还有可能解释你的每一部分,如果我有一个大的记录可以解决它是否可以扩展?
答案 0 :(得分:1)
您需要定义(或识别)与grep输出匹配的控制逻辑。
根据你给出的内容,我假设如下:
然后以下awk脚本将执行格式化:
BEGIN {
# initialize ordinal
ordinal=1;
# print heading
printf "%-3s %5s %4s\n", "#", "Name", "LD #"
}
# match trigger line for output
/^[0-9]+$/ { printf "%3d %5s %4s\n", ordinal++, label, $1;
# cleanou label - not necessary for single data item case
# we are done with this input line
next;
}
# collect data item
{
label=$1;
# we are done with this input line
next;
}
如果要包含更多记录项(导致更多列),您可以检查是否遇到了前面的列值。
甚至只需使用计数器来指示您在记录中的哪一列。
然后你可以使用例如:
BEGIN {
# initialize ordinal
ordinal=1;
column=0;
# print heading
printf "%-3s %5s %4s\n", "#", "Name", "LD #"
}
# match trigger line for output
/^[0-9]+$/ { printf "%3d (%d)", ordinal++, column;
for (i=0; i < column; i++) {
printf " %s", data[i];
data[i] = "";
}
printf "\n";
# we are done with this input line
column=0;
next;
}
# collect data item
{
data[column++]=$1;
if (length($1) > max[column]) {
max[column]=length($1);
}
# we are done with this input line
next;
}
END {
for (i=0; i< length(max); i++) {
printf "Col %d: %d\n", i, max[i];
}
}
我还提供了一种确定列大小(字符数)的方法。