我有一个包含这种记录的文件
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
该文件中的内容而不是此内联查找。