Awk 使用printf自动设置文本格式(基于每列的maxlength)

Awk 使用printf自动设置文本格式(基于每列的maxlength),awk,Awk,输入数据有n列以“|”表示,如下例所示: 121|234234|5345|2342342342432423 1|2342|2|2342 234|23|343|34214222 如何找到每列的最大长度,并在以后输入的printf格式中使用它,即使输入数据在将来发生更改,该格式也会起作用 在指挥方面,例如: awk-F'|'''。。。。。{printf“%-longestincol1s%-longestincol2s%-longestincol3s%-s\n”、$1、$2、$3、$4}”列 如果你

输入数据有n列以“|”表示,如下例所示:

121|234234|5345|2342342342432423
1|2342|2|2342
234|23|343|34214222
如何找到每列的最大长度,并在以后输入的printf格式中使用它,即使输入数据在将来发生更改,该格式也会起作用

在指挥方面,例如:

awk-F'|'''。。。。。{printf“%-longestincol1s%-longestincol2s%-longestincol3s%-s\n”、$1、$2、$3、$4}”列 如果你只想有一个漂亮的打印输出,你可以使用
column

column -t -s'|' -o'|' file
但是,它并不完全适合您的
printf
格式。它没有左对齐

Awk 如果要使用awk进行此操作,可以应用至少两种方法:

处理该文件一次 让awk遍历输入一次,在循环期间计算最大宽度,将所有行保存在内存中。最后,
end{…}
循环遍历数组以进行打印

处理该文件两次 首先让awk遍历文件,只需计算最大宽度,然后保存到变量中。第二步,进行格式化打印

我没有给出工作代码,但我希望我能回答清楚。当您下次遇到类似问题时,它也会很有帮助。

Column 如果你只想有一个漂亮的打印输出,你可以使用
column

column -t -s'|' -o'|' file
但是,它并不完全适合您的
printf
格式。它没有左对齐

Awk 如果要使用awk进行此操作,可以应用至少两种方法:

处理该文件一次 让awk遍历输入一次,在循环期间计算最大宽度,将所有行保存在内存中。最后,
end{…}
循环遍历数组以进行打印

处理该文件两次 首先让awk遍历文件,只需计算最大宽度,然后保存到变量中。第二步,进行格式化打印


我没有给出工作代码,但我希望我能回答清楚。下次遇到类似问题时,它也会很有帮助。

输入:

$ cat infile
121|234234|5345|2342342342432423
1|2342|2|2342
234|23|343|34214222
awk '
     BEGIN{
            FS=OFS="|"
     }
     FNR==NR{
          for(i=1; i<=NF;i++)
             wd[i]=wd[i]>length($i)?wd[i]:length($i);
             next
     }
     {
          for(i=1; i<=NF; i++)
              printf("%*s%s",wd[i],$i,(i<NF?OFS:ORS)); 

     }
   ' infile infile
输出:

$ cat infile
121|234234|5345|2342342342432423
1|2342|2|2342
234|23|343|34214222
awk '
     BEGIN{
            FS=OFS="|"
     }
     FNR==NR{
          for(i=1; i<=NF;i++)
             wd[i]=wd[i]>length($i)?wd[i]:length($i);
             next
     }
     {
          for(i=1; i<=NF; i++)
              printf("%*s%s",wd[i],$i,(i<NF?OFS:ORS)); 

     }
   ' infile infile
printf(“%*s%s”

可读性更好:

$ cat infile
121|234234|5345|2342342342432423
1|2342|2|2342
234|23|343|34214222
awk '
     BEGIN{
            FS=OFS="|"
     }
     FNR==NR{
          for(i=1; i<=NF;i++)
             wd[i]=wd[i]>length($i)?wd[i]:length($i);
             next
     }
     {
          for(i=1; i<=NF; i++)
              printf("%*s%s",wd[i],$i,(i<NF?OFS:ORS)); 

     }
   ' infile infile

printf("%5s", "");   

输入:

$ cat infile
121|234234|5345|2342342342432423
1|2342|2|2342
234|23|343|34214222
awk '
     BEGIN{
            FS=OFS="|"
     }
     FNR==NR{
          for(i=1; i<=NF;i++)
             wd[i]=wd[i]>length($i)?wd[i]:length($i);
             next
     }
     {
          for(i=1; i<=NF; i++)
              printf("%*s%s",wd[i],$i,(i<NF?OFS:ORS)); 

     }
   ' infile infile
输出:

$ cat infile
121|234234|5345|2342342342432423
1|2342|2|2342
234|23|343|34214222
awk '
     BEGIN{
            FS=OFS="|"
     }
     FNR==NR{
          for(i=1; i<=NF;i++)
             wd[i]=wd[i]>length($i)?wd[i]:length($i);
             next
     }
     {
          for(i=1; i<=NF; i++)
              printf("%*s%s",wd[i],$i,(i<NF?OFS:ORS)); 

     }
   ' infile infile
printf(“%*s%s”

可读性更好:

$ cat infile
121|234234|5345|2342342342432423
1|2342|2|2342
234|23|343|34214222
awk '
     BEGIN{
            FS=OFS="|"
     }
     FNR==NR{
          for(i=1; i<=NF;i++)
             wd[i]=wd[i]>length($i)?wd[i]:length($i);
             next
     }
     {
          for(i=1; i<=NF; i++)
              printf("%*s%s",wd[i],$i,(i<NF?OFS:ORS)); 

     }
   ' infile infile

printf("%5s", "");   

我认为GNU专栏可以使用
-o
,我认为GNU专栏可以使用
-o