ファイルの固定長フィールドをスペースで区切られたフィールドに変換する方法

ファイルの固定長フィールドをスペースで区切られたフィールドに変換する方法

各フィールドの長さが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

1つがある場合は、変数を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

関連情報