入力例:
:20:210301/9944072
:25:PL63213000342008099410720012
:28C:6032563
:60F:C2101010101PLN4138,23
:61:2101010101D13,61
:86:^101
^20Text ANY
^27YTRDTAL co. ltd.
^30
^31
次のいずれかで始まる行を探します: :60F: :61: :62M: :60M: :62F:
文字列C、D、またはPLNの後に始まる値を見つけます(例の値は4138、23、および13,61です)。
12,2 文字形式で値を書き込む
希望の出力:
:20:210301/9944072
:25:PL63213000342008099410720012
:28C:6032563
:60F:C2101010101PLN000000004138,23
:61:2101010101D000000000013,61
:86:^101
^20Text ANY
^27YTRDTAL co. ltd.
^30
^31
編集する: awkを使用して日付形式をYYMMDDからYYMMDDMMに変更する前に、
cat ./${file}.tmp.mt940 | awk -F ':61:' '{if ($1)
print $1;
else
printf "%s%s%s%s\n", substr($0,0,6), substr($0,7,4), substr($0,7,4), substr($0,11,40)
}' > ${file}.tmp2.mt940
0を追加して同じことを試しましたが、今ではawkで2つの異なる文字/文字列(D、C、PLN、およびカンマ)を取得する方法がわかりません。
編集:最終作業ソリューション:
cat ./${file}.tmp2.mt940 | gawk -F '/^:60F:/ or
/^:60M:/ or
/^:61:/ or
/^:62F:/ or
/^:62M:/' '{if (match($0, /^(.*)(PLN|C|D)([0-9]+),([0-9]+)$/, p)) {
printf("%s%s%012d,%02d\n", p[1], p[2], p[3], p[4]);
} else
print $1
}' > ${file}.mt940
答え1
少しアッPOSIX病棟awk
:
/^:60F:/ ||
/^:60M:/ ||
/^:61:/ ||
/^:62F:/ ||
/^:62M:/ {
n1 = match($0, /(PLN|C|D)[0-9]+,[0-9]+$/);
if (n1) {
p1 = substr($0, 0, n1-1);
r1 = substr($0, n1);
n2 = match(r1, /[0-9]/);
p2 = substr(r1, 0, n2-1);
r2 = substr(r1, n2);
n3 = index(r2, ",");
p3 = substr(r2, 0, n3-1);
p4 = substr(r2, n3+1);
printf("%s%s%012d,%02d\n", p1, p2, p3, p4);
next;
}
}
1
以下が利用可能であれば、gawk
より良いです。
/^:60F:/ ||
/^:60M:/ ||
/^:61:/ ||
/^:62F:/ ||
/^:62M:/ {
if (match($0, /^(.*)(PLN|C|D)([0-9]+),([0-9]+)$/, p)) {
printf("%s%s%012d,%02d\n", p[1], p[2], p[3], p[4]);
next;
}
}
1
答え2
最終作業ソリューション:
cat ./${file}.tmp2.mt940 | gawk -F '/^:60F:/ or
/^:60M:/ or
/^:61:/ or
/^:62F:/ or
/^:62M:/' '{if (match($0, /^(.*)(PLN|C|D)([0-9]+),([0-9]+)$/, p)) {
printf("%s%s%012d,%02d\n", p[1], p[2], p[3], p[4]);
} else
print $1
}' > ${file}.mt940