提取“字段”并条带化子字符串

问题描述 投票:0回答:1

我有一个如下所示的文件名列表。

A006280002.40.D7A5A.msg
A006280002.41.C7E4E.msg
A006280002.42.16362.msg
A006280002.43.C4048.msg
A12960004.1.4D6AC.xls
K00976.1.81F42.pdf

我需要完成两件事。首先,所有这些文件名都以表示客户参考号的代码作为前缀。所有客户参考编号均以单个字母开头,但您可以看到,有些编号具有一致的零填充,有些则不然。

客户端参考是文件名的第一部分,例如A00628。然而,假设有人可能使用过 A0628 或 A628 等变体。根据上面的示例,数据 A12960004.1.4D6AC.xls 的客户端引用为 A1296,因此较短。我不需要或不想修复零填充。

下一部分是紧跟在客户参考号后面的案例参考号,因此使用相同的 A00628 示例,它是 0002。在这种情况下,我们有两个问题,首先,可能很明显,这最终需要两个(或更多) ) 数字(如果客户最终有 10 个或更多案例),例如0011。您还可以看到问题的示例,在某些情况下根本没有提供案例编号,例如K00976.1.81F42.pdf 表示客户参考号 K00976,但没有案例参考号。如果或更准确地说,遇到其中之一,我希望使用案例参考号 0000。

我想提取客户端引用并将其存储为变量,我想提取案例引用并将其存储为变量,如果没有案例引用,则默认存储 0000 作为案例参考编号值。

我认为所需的解决方案应该处理供客户参考的可变数量的零,虽然案例参考号的位数似乎是一致的,但前导零的数量并不基于客户有多少案例上调。 “查找”案例参考号的方法似乎是找到第一个句点并向后移动四个数字,从而获得完整的案例参考号。如果按照 K00976.1.81F42.pdf 的示例,文件名没有案例参考号,那么此 应该 会失败,并使用值 0000 来代替。

我不需要对文件名的其余部分做任何事情。因此,使用上面的示例列表,所需的结果将是 -

客户参考 案例参考
A00628 0002
A00628 0002
A00628 0002
A00628 0002
A1296 0004
K00976 0000

我对使用什么工具没有任何个人偏好,例如sed、awk 等,但这超出了我有限的 sed 知识。

我确实得到了以下 sed 命令,它仅部分解决了这个问题。

回显“$var”| sed 's/000[0-9].*//g'

如果我们忽略案例参考编号具有多个非零数字的可能性,则这无法处理完全缺少案例编号的文件名。否则它会提取客户参考号。

shell substring
1个回答
0
投票

给定这些文件名:

$ ls -1 *
A006280002.40.D7A5A.msg
A006280002.41.C7E4E.msg
A006280002.42.16362.msg
A006280002.43.C4048.msg
A12960004.1.4D6AC.xls
K00976.1.81F42.pdf

您可以循环遍历文件并使用

gawk
进行拆分,然后分配给两个 bash 变量,如下所示:

for fn in *; do
    read -r client case <<<$(echo "$fn" | gawk -F. '{
                            match($1,/^([A-Z]0*[1-9]*)([0-9]*).*$/,m)
                            if (m[2]) print (m[1],m[2]) 
                            else print (m[1],"0000")}')
    echo "$fn => $client | $case"                            
done   

打印:

A006280002.40.D7A5A.msg => A00628 | 0002
A006280002.41.C7E4E.msg => A00628 | 0002
A006280002.42.16362.msg => A00628 | 0002
A006280002.43.C4048.msg => A00628 | 0002
A12960004.1.4D6AC.xls => A1296 | 0004
K00976.1.81F42.pdf => K00976 | 0000
© www.soinside.com 2019 - 2024. All rights reserved.