我的输出文件包含以下内容
输出.txt
2020.11.07-22.3.31 INFO - :|FSNAME:|AVAILABLE:|AVAILABILITY
2020.11.07-22.3.31 INFO - :|/opt:|yes:|1.4GB
2020.11.07-22.3.31 INFO - :|/data:|yes:|30GB
上述值是output.txt
从相应的变量中添加的,因此输出的大小会有所不同,并且我无法对字母进行限制。
我没有安装column
命令miller
!
我使用了以下方法,但输出不按顺序
awk '{ gsub(":", " " ) } 1' output.txt
2020.11.07-22.3.31 INFO - |FSNAME |AVAILABLE |AVAILABILITY 2020.11.07-22.3.31 INFO - |/opt |yes |1.4GB 2020.11.07-22.3.31 INFO - |/data |yes |30GB
awk -F ':' '{printf "%-10s%-10s%-10s%-10s\n", $1,$2,$3,$4}' output.txt
2020.11.07-22.3.31 INFO - |FSNAME |AVAILABLE|AVAILABILITY 2020.11.07-22.3.31 INFO - |/opt |yes |1.4GB 2020.11.07-22.3.31 INFO - |/data |yes |30GB
如果写入我的输出文件的可变大小之一超过 10 秒,则格式不正确,如下所示
输出.txt
2020.11.07-22.3.31 INFO - :|FSNAME:|AVAILABLE:|AVAILABILITY
2020.11.07-22.3.31 INFO - :|/opt:|yessssssss:|1.4GB
2020.11.07-22.3.31 INFO - :|/data:|yes:|30GB
awk -F ':' '{printf "%-10s%-10s%-10s%-10s\n", $1,$2,$3,$4}' output.txt
2020.11.07-22.3.31 INFO - |FSNAME |AVAILABLE|AVAILABILITY
2020.11.07-22.3.31 INFO - |/opt |yessssssss|1.4GB
2020.11.07-22.3.31 INFO - |/data |yes |30GB
请帮忙解决一下?
答案1
以下双遍方法应将字段格式化为固定列宽:
awk -F':\\|' -v OFS='|' 'NR==FNR{for (i=1;i<=NF;i++) {if (length($i)>max[i]) max[i]=length($i);} next;}
{for (i=1;i<=NF;i++) $i=sprintf("%-*s",max[i],$i)}1' output.txt output.txt
这将处理output.txt
两次(因此您必须将其指定两次作为 的参数awk
)。
- 在第一遍中(其中
FNR
,每个文件行计数器,等于NR
,全局行计数器),我们只需查找每个字段条目的最大长度(通过迭代从$1
到 的所有字段$NF
),并将其存储在数组max
。 - 在第二遍中,我们将字段(重新)格式化为根据最大字段宽度数组
sprintf
确定的固定宽度。max
- 输入的字段分隔符将被视为组合
:|
字符序列(具有适当的转义,因为多字符输入字段分隔符被视为正则表达式,并且|
在那里具有特殊含义)。输出字段分隔符将设置为单个|
.
您的示例的结果
2020.11.07-22.3.31 INFO - |FSNAME|AVAILABLE|AVAILABILITY
2020.11.07-22.3.31 INFO - |/opt |yes |1.4GB
2020.11.07-22.3.31 INFO - |/data |yes |30GB