如何以表格格式打印带有行列的文本文件的输出

如何以表格格式打印带有行列的文本文件的输出

我的输出文件包含以下内容

输出.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        

相关内容