使用awk打印格式化输出

时间:2016-04-19 12:29:05

标签: unix awk

我使用awk生成以下输出

   root | /root
   bin | /bin
   daemon | /sbin
   adm | /var/adm
   lp | /var/spool/lpd

我的awk查询如下

  head -n 5 /etc/passwd | awk ' BEGIN{ FS=":";OFS=" | "; } { print $1 , $6 } '

我希望输出以格式化的方式显示,如下所示

   root   | /root
   bin    | /bin
   daemon | /sbin
   adm    | /var/adm
   lp     | /var/spool/lpd

是否可以使用awk实现此目的。此外,代码应该适用于由|

分隔的多个输入字段

3 个答案:

答案 0 :(得分:2)

尝试将您的awk结果传递给column

awk 'whatever'|column -t

答案 1 :(得分:1)

Private Sub Txtbx_TimeAvailable_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Me.Txtbx_TimeAvailable.Value <> Format(Me.Txtbx_TimeAvailable.Value, "[h]:mm") Then MsgBox "Please enter correct time format in hh:mm" Cancel = True Me.Txtbx_TimeAvailable.Value = vbNullString Else ThisWorkbook.Sheets(SELECTEDWORKSHEET).Range("C60").Value = Txtbx_TimeAvailable.Text Call UpdateDentistMainForm End If End Sub 解决方案将使用printf

awk

请注意,如果您删除awk -F: '{printf "%-15s | %s\n",$1,$6}' /etc/passwd 符号,则可以右对齐用户ID。

答案 2 :(得分:0)

$ cat tst.awk
BEGIN { FS=":"; OFS=" | " }
FNR<=5 {
    for (i=1;i<=NF;i++) {
        wid[i] = (wid[i] > length($i) ? wid[i] : length($i))
        val[NR,i] = $i
    }
}
END {
    for (rowNr=1; rowNr<=NR; rowNr++) {
        printf "%-*s | %-*s\n", wid[1], val[rowNr,1], wid[6], val[rowNr,6]
    }
}

以上计算每个字段的最大宽度,然后在打印时使用它,以确保字段无论输入文件的内容如何都能正确对齐。