将数值右对齐(recfmt 输出)

将数值右对齐(recfmt 输出)

我正在使用 GNU Recutils 以纯文本格式创建 Unix 数据库。通过以下脚本,我可以获得所选类别的书籍列表:

recsel -t book -e "Category='$1'" "$RECFILE" | recfmt -f bycat.templ

输出如下:

1: Book title
2: Book title
55: Book title
128: Book title

该文件bycat.templ包含以下内容:

{{Id}}: {{Title}} (read: {{Read}})

根据该文件,似乎不可能定义该文件的右侧对齐方式手动的

所以我尝试找到一个 Unix 解决方案,可能对每一行使用printf, awkxargs或者可能是一个bucle 。for我不知道如何实现这一目标。

所需的输出:

  1: Book title
  2: Book title
 55: Book title
128: Book title

答案1

给你:

文件:book.awk

BEGIN {
    FS = ":"
}
{
    id = $1
    $1 = ""
    sub(/^ +/, "", $0)
    printf("%3d: %s\n", id, $0)
}

执行:

recsel ... | recfmt ... | awk -f book.awk

输出:

  1: Book title
  2: Book title
 55: Book title
128: Book title

答案2

无论 ID 中有多少位数字,也无论标题中可以出现哪些字符(包括:),在每个 Unix 机器上的任何 shell 中使用任何 awk 的 2 遍方法:

$ cat tst.awk
{
    id = title = $0
    sub(/ *:.*/,"",id)
    sub(/[^:]*: */,"",title)
}
NR==FNR {
    wid = length(id)
    maxWid = (maxWid > wid ? maxWid : wid)
    next
}
{ printf "%*s: %s\n", maxWid, id, title }

$ awk -f tst.awk file file
  1: Book title
  2: Book title
 55: Book title
128: Book title

相关内容