查找某个位置并将其替换为值列表

查找某个位置并将其替换为值列表

我有一个包含这种记录的文件

DL2016-12-02P123456             PW5038               1234561180118       123456O00400010180421          0755480            HEALTH            B   NOT APPLICABLE                                    NOT APPLICABLE     2016-08-012016-12-022016-09-012016-08-312016-09-302016-09-012016-09-30949569014            PW5018             07554800010001089200001       00100010892                   00000010304MDIRECT    00000000000000000000{          HPS                           PW5018COCOAA007708200000010304DXQ7262016001      

我想格式化每行中字段 385-396 和 415-427 中存在的值。例如00000010304M 000000000000{ 使用此命令cut -c 385-396,415-427 --output-delimiter=" "文件后。这将返回00000010304M 000000000000{ 根据参考指南M = -1,,{ = +2等等N = +3。正如您所看到的,396 位置的数据是M, 427 位置的数据是 ,{那么数据应该类似于-0000001030.41+00000000000.05。这里 M 被替换为 -1,其中 - 符号放置在开头,1 放置在 M 位置。另外,小数点前2位。

Last Character in Input Field|Positive or Negative|Last Number|Incoming Field|Value after replacement
{   +   0   12345{  1234.5
A   +   1   12345A  1234.51
B   +   2   12345B  1234.52
C   +   3   12345C  1234.53
D   +   4   12345D  1234.54
E   +   5   12345E  1234.55
F   +   6   12345F  1234.56
G   +   7   12345G  1234.57
H   +   8   12345H  1234.58
I   +   9   12345I  1234.59

}   -   0   12345}  -1234.5
J   -   1   12345J  -1234.51
K   -   2   12345K  -1234.52
L   -   3   12345L  -1234.53
M   -   4   12345M  -1234.54
N   -   5   12345N  -1234.55
O   -   6   12345O  -1234.56
P   -   7   12345P  -1234.57
Q   -   8   12345Q  -1234.58
R   -   9   12345R  -1234.59

该文件只是说,如果字段号 396 有 M,则使用下一列数据并将其替换到当前文件中。意味着 00000010304M 更改为 -0000001030.44 。您可以看到参考文件将其显示为 M-4 12345M -1234.54 。例如,M 字母要替换,更改为 4,前面有一个 - 符号,现在看起来像 -1234.54 代替 12345M

答案1

您可以像开始时一样继续cut,但根据需要将其分成更多部分。为了给您一个想法,这里有一个简短的片段,可以转换每行的第一部分。

cut -c 385-394,395,396 | \
while read integral dec suffix
do  case $suffix in
        '{');; # Nothing
        A) last=1;;
        B) last=2;;
        ...
        '}') sign=-;;
        J) sign=- last=1;;
        ...
    esac
    echo $sign$integral.$dec$last
done

你明白了。展开cut以也包含第二个数字的字段。

如果您想使用一个单独的文件来翻译最后的字母,您可以使用grep该文件中的内容而不是此内联查找。

相关内容