【问题标题】:awk line break after each file每个文件后的 awk 换行符
【发布时间】:2012-06-10 09:08:10
【问题描述】:

使用此脚本,每个字段都根据当前文件的最长单词打印出来,但每个文件都需要换行。如何实现?

awk 'BEGIN{ORS="\n"}FNR=NR{a[i++]=$0; if(length($0) > length(max)) max=$0;l=length(max)}  END{ for(j=1; j<=i;j++) printf("%-"(l+1)"s,",a[j-1])}' file1 file2 >outfile

文件1

HELLO
WORLD
SOUTH IS
WARM
NORTH IS
COLD

文件2

HELLO
WORLD
SOUTH
WARM
NORTH
COLD

输出

HELLO     ,WORLD     ,SOUTH IS  ,WARM      ,NORTH IS  ,COLD      
HELLO ,WORLD ,SOUTH ,WARM  ,NORTH ,COLD  

【问题讨论】:

  • \n 添加到您要打印的每一行的末尾。我认为ORS 只会在您使用print 而不是printf 时使用。

标签: arrays awk printf


【解决方案1】:

您的要求并不完全清楚,但也许您只是想要:

FNR==1 {print "\n"}

它会在开始读取文件的第一行时打印一个换行符。确保此模式/操作在任何其他操作之前,以便在任何其他操作为当前文件的第一行打印任何内容之前打印换行符。 (这似乎不适用于您的情况,因为不存在此类操作。)

【讨论】:

    【解决方案2】:

    花了我一些时间,用这个脚本解决了。

    awk '{ NR>1 && FNR==1 ? l=length($0) && a[i++]= "\n" $0 : a[i++]=$0 }
    {if(NR>1 && FNR==1) for(e=(i-c);e<=(i-1);e++) b[e]=d ;c=FNR; d=l }
    { if( length($0) > l) l=length($0)+1 } 
    END{for(e=(i-c+1);e<=i;e++) b[e]=d; for(j=1;j<=i;j++) printf("%-"b[j]"s,",a[j-1] )}' infiles* >outfile
    

    【讨论】:

      【解决方案3】:
      #!/usr/bin/awk -f
      function beginfile (file) {
          split("", a)
          max = 0
          delim = ""
      }
      
      function endfile (file) {
          for (i = 1; i <= lines; i++) {
              printf "%s%-*s", delim, max, a[i]
              delim = " ,"
          }
          printf "\n"
      }
      
      FILENAME != _oldfilename \
           {
               if (_oldfilename != "")
                   endfile(_oldfilename)
               _oldfilename = FILENAME
               beginfile(FILENAME)
           }
      
           END   { endfile(FILENAME) }
      
      {
          len = length($0)
          if (len > max) {
              max = len
          }
          a[FNR] = $0
          lines = FNR
      }
      

      运行它:

      chmod u+x filename
      ./filename file1 file2
      

      请注意,在gawk 中,您可以使用delete a 而不是split("", a)。 GAWK 4 内置了BEGINFILEENDFILE

      【讨论】:

        猜你喜欢
        • 2016-07-17
        • 2019-03-17
        • 2017-10-09
        • 1970-01-01
        • 2023-02-11
        • 2011-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多