awkスクリプトの各行に対してFIELDWIDTHSを変更できますか?

awkスクリプトの各行に対してFIELDWIDTHSを変更できますか?

私が受け取ったファイルには、データセットを表す行が含まれています。各行には、複数のデータフィールドを表す文字が区別なく含まれています。各データフィールドを抽出するには、行を破棄する必要があります。

ABCD075BCD156300544E0001000900125349544520494

->

ABCD 075BCD 15630 0544 E00010009 00 12 5349544520494

各フィールドの文字数がわかっているので、FIELDWIDTHSを使用してawkでこれを行うことができます。このアプローチは、すべてのデータセットが同一である場合に有効ですが、そうではありません。問題をより複雑にすることは、フィールドの1つを読み取ると、それがどのタイプのデータセットであるかを知ることができるということです。

したがって、データ型を読み取るには、FIELDWIDTHSセットを適用する必要があるようです。次に、別のFIELDWIDTHSセットを適用し、getlineを使用して同じ行を再読み込みしてデータを抽出します。ただし、変更されたフィールド幅が適用されないため、これは機能しません。

BEGIN {
  FIELDWIDTHS = "30 2";                  # set FIELDWIDTHS to read data type
}

{
  print $2;                              # print data type
  FIELDWIDTHS = "5 5 5 5 5 5 5 5 5 5 5"; # change fieldwidths to read data
  getline NF;                            # reread current line to use new fieldwidths
  print $2;                              # print data field
  FIELDWIDTHS = "30 2";                  # change fieldwidths to read next line
}

END {
}

どんなアドバイスも本当にありがとうございます。

ベストアンサー1

何でもアッ:

awk 'NR%2   { fieldwidths="4 6 5 4 9 2 2 13" } # update fieldwidths on odd line numbers
    !(NR%2) { fieldwidths="4 5 4 2 3 9 7 11" } # update fieldwidths on even line numbers
    # condition { fieldwidths="# # #  ..." }   # whatever other condition you want...

{ fields=split(fieldwidths, fldwd); startPos=1;
  for(i=1; i<=fields; i++) {
      printf "%s", (i==1?"": OFS) substr($0, startPos, fldwd[i])
      startPos+=fldwd[i]
  }
  print ""
}' infile

おすすめ記事