Unix使用grep或awk或sed将文本格式化为表格

时间:2016-03-20 15:37:06

标签: unix

我已经能够找到grep没问题但是分配基本上是将数据拉出并格式化并将其显示为具有多行的表列。现在它不应该是任何疯狂的因为我们只有awksed的基本知识。现在我很好奇:有没有办法从grep获取输出并格式化,例如我得到:

Jake
0001
Bob
0002
Kim
0003

并想要做到这样的事情

#     Name   LD #
---   ----   ----
  1   Jake   0001 
  2   Bob    0002
  3   Kim    0003

还有可能解释你的每一部分,如果我有一个大的记录可以解决它是否可以扩展?

1 个答案:

答案 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];
     }
}

我还提供了一种确定列大小(字符数)的方法。