Linux
查找值並以 12,2 字元長格式寫入
範例輸入:
: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
現在我嘗試通過添加零來做同樣的事情,但現在不知道如何在 awk 中搜尋兩個不同的字元/字元串(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
最終工作解決方案:
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
這在 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