如何将文件中的固定长度字段转换为空格分隔

如何将文件中的固定长度字段转换为空格分隔

我有一个固定长度的矩阵类型文件,其中每个字段的长度为 20 个字符。

  1. 如何将其转换为空格分隔的文件?

另外还有一些缺失值,我想用连字符 ( -) 替换。

  1. 我怎样才能做到这一点?

我将使用输出进行awk操作。

具有 10 个字符字段长度的文件的示例输入。

 head1     head2     head3
 a         b         c
           c          
 c                   a

输出示例

head1 head2 head3
a b c
- c -
c - c

答案1

珀尔:

perl -ne '
    BEGIN {$width = 10}
    while (length) {
        ($word = substr($_,0,$width)) =~ s/^\s+|\s+$//g; # trim whitespace
        $word ||= "-";
        print $word, " "; 
        substr($_,0,$width) = "";
    }
    print "\n";
' file

答案2

这对我有用:

sed 's/^ //g' input | tr -s "[:blank:]" "," | \
awk -F, '!$1{printf "- "} $1{printf "%s ", $1} \
  !$2{printf "- "} $2{printf "%s ", $2} \
  !$3{print "-"} $3{print $3}'

解释:

  • sed 's/^ //g' input删除前导空格(如果存在)
  • tr -s "[:blank:]" ",": 用逗号替换所有空格
  • awk ...:使用分隔符,并打印值,或者-如果值为空则打印。

答案3

awk方式

awk '{for(x=0;x<length($0);x+=10)y=y" "((z=substr($0,x,10))~/[[:graph:]]/?z:"-")
      gsub(/ +/," ",y);print y;y=""}' file

如果他们可以在字段中留有空格

awk '{for(x=0;x<length($0);x+=10){z=gensub(/(^ +| +$)/,"", "g",substr($0,x,10))
      y=y" "(z?z:"-")}print y;y=""}' file

答案4

如果你有,gawk那么你可以使用FIELDWIDTHS变量来告诉gawk如何用固定的柱状边界分割输入。这是一个实验性功能。分配给覆盖用于字段分割FIELDWIDTHS的使用。FS

这是用法示例,

gawk 'BEGIN{
             FIELDWIDTHS = "10 10 10"
           }
           {
             s = q = "" 
             for(i=1;i<=NF;i++)
             { 
               s = $i
               gsub(/ +/,"",s)
               s = (length(s) )? s : "-"
               q = sprintf("%s%s%s",q,(length(q)?OFS:""),s)  
             } 
               print q
           }
      ' file

相关内容