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