Bash

將數值右對齊(recfmt 輸出)

  • September 24, 2021

我正在使用 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或者for每行都有一個 bucle。我不知道如何實現這一點。

所需的輸出:

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

給你:

文件: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

在每個 Unix 機器上的任何 shell 中使用任何 awk 的 2-pass 方法,無論 ID 中的數字有多少,也無論標題中可以出現哪些字元(包括:):

$ 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

引用自:https://unix.stackexchange.com/questions/667605