![将数值右对齐(recfmt 输出)](https://linux22.com/image/195282/%E5%B0%86%E6%95%B0%E5%80%BC%E5%8F%B3%E5%AF%B9%E9%BD%90%EF%BC%88recfmt%20%E8%BE%93%E5%87%BA%EF%BC%89.png)
我正在使用 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
, awk
,xargs
或者可能是一个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