将 shell 脚本输出格式化为表格

将 shell 脚本输出格式化为表格

我正在循环中运行一个脚本,该脚本根据某些逻辑创建一些数据,然后以某种组合显示输出,但我得到的输出位于新行中

Roll number               : 187437366 
Mobile Number             : 07995036927
Grade                     : A
Roll number               : 187437367 
Mobile Number             : 07995036937
Grade                     : B

但是我想要以表格格式输出,如下所示 -

Roll Number | Mobile Number | Grade
187437366   | 07995036927   | A
187437466   | 07995037922   | A2
187437266   | 07995036921   | B
187437766   | 07995036120   | C

我无法找到如何实现这一目标的概念......有人可以帮助我吗?

答案1

awk当然,它并不是工具箱中唯一的工具。只是为了平衡不可避免的大量awk脚本,这里是磨坊主行动中:

%mlr --ixtab --ips : --opprint cat << END
卷号:187437366
手机号码 : 07995036927
等级:A

卷号:187437367
手机号码 : 07995036937
等级:B

结尾
卷号 手机号码 等级
 187437366 07995036927 A
 187437367 07995036937乙
%

只需让您的脚本在每条记录后发出一个空行,或者添加一个中间过滤器来执行此操作,您所拥有的就是“XTAB”输入格式,并作为:“对分隔符”字符(参见--ixtab--ips选项)。

上述是“PPRINT”输出格式。对于更像问题的输出,可以--barred选择“PPRINT”和“Markdown”替代输出格式--omd。但是,我没有立即提供最新版本的 Miller 进行演示。

答案2

一班轮:

$ awk -F':' '{printf "%s%s", $2, (/^Grade/)?"\n":"\t|"}' file

输出:

 187437366      | 07995036927   | A
 187437367      | 07995036937   | B

答案3

使用awk制表符和|作为分隔符:

awk -F: '
  BEGIN{ printf "%s\t|%s\t|%s","Roll Number","Mobile Number","Grade"}
  { gsub(/ /,"",$2); printf "%s", ($1 ~ "^Roll" ? RS : "\t|") $2 }
  END { print "" }
' file

在块中,使用制表符和每个字段之间的BEGIN打印标题。 然后从第二个字段(前导和尾随)中删除所有空格字符并|

  1. 如果第一个字段以 开头Roll,则添加记录分隔符RS(换行符),否则打印制表符并|
  2. 打印第二个字段

END块中,打印另一个换行符。

输出:

Roll Number     |Mobile Number  |Grade
187437366       |07995036927    |A
187437367       |07995036937    |B

答案4

无需将代码耦合到输入文件中的任何数据值,而是仅依赖于重复的标头值:

$ cat tst.awk
BEGIN {
    FS = "[[:space:]]*:[[:space:]]*"
    OFS = "|"
}
seen[$1]++ { prt() }
{
    hdrs[++numFlds] = $1
    vals[numFlds] = $2
}
END { prt() }

function prt(   fldNr) {
    if ( !doneHdr++ ) {
        for (fldNr=1; fldNr<=numFlds; fldNr++) {
            printf "%s%s", hdrs[fldNr], (fldNr<numFlds ? OFS : ORS)
        }
    }
    for (fldNr=1; fldNr<=numFlds; fldNr++) {
        printf "%s%s", vals[fldNr], (fldNr<numFlds ? OFS : ORS)
    }
    numFlds = 0
    delete seen
}

$ awk -f tst.awk file | column -s'|' -o' | ' -t
Roll number | Mobile Number | Grade
187437366   | 07995036927   | A
187437367   | 07995036937   | B

相关内容