Kay*_*efe 10 awk printf text-formatting
我了解如何使用 awk 的 printf 函数,但我不想指定每个字段。
例如,假设这是我的文件:
c1|c2|c3|c4|c5
c6|c7|c8|c9|c10
c11|c12|c13|c14|c15
Run Code Online (Sandbox Code Playgroud)
我想格式化它,以便每条记录的第一个字段都是 c11 的宽度——第一个字段中最长的单元格:
c1 |c2|c3|c4|c5
c6 |c7|c8|c9|c10
c11|c12|c13|c14|c15
Run Code Online (Sandbox Code Playgroud)
我知道我可以指定:
awk -F"|" '{printf "%-3s%s%s%s%s\n", $1, $2, $3, $4, $5}' file > newfile
Run Code Online (Sandbox Code Playgroud)
假设我知道我想要第一列的宽度是多少,但我不知道文件中有多少个字段。基本上我想做类似的事情:
... '{printf "%-3s|", $1}'
Run Code Online (Sandbox Code Playgroud)
...然后以原始格式打印其余字段。
ste*_*ver 14
您只能使用sprintf重新格式化$1。
前任。
$ awk 'BEGIN{OFS=FS="|"} {$1 = sprintf("%-3s",$1)} 1' file
c1 |c2|c3|c4|c5
c6 |c7|c8|c9|c10
c11|c12|c13|c14|c15
Run Code Online (Sandbox Code Playgroud)
要找出第一个字段的最大/最长长度,然后根据该长度重新格式化字段中的值,您必须对文件进行两次单独的传递。
awk 'BEGIN { OFS = FS = "|" }
FNR == NR { if (m < (n=length($1))) m = n; next }
{ $1 = sprintf("%-*s", m, $1); print }' file file
Run Code Online (Sandbox Code Playgroud)
(注意输入文件在命令行中指定了两次)
对于您提供的数据,这将产生
c1 |c2|c3|c4|c5
c6 |c7|c8|c9|c10
c11|c12|c13|c14|c15
Run Code Online (Sandbox Code Playgroud)
第一遍由FNR == NR块处理,它只是跟踪迄今为止看到的最长字段(m包含看到的最大长度),然后跳到下一行。
第二遍由最后一个块处理,它使用 重新格式化第一个字段sprintf()。格式字符串的%-*s意思是“一个左对齐的字符串,其宽度由保存实际字符串的参数之前的整数参数给出”。
通过将标量m转换为包含每列最大宽度的数组,这显然可以扩展为所有列:
awk 'BEGIN { OFS = FS = "|" }
FNR == NR { if (m < (n=length($1))) m = n; next }
{ $1 = sprintf("%-*s", m, $1); print }' file file
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
573 次 |
| 最近记录: |