我有一个如下所示的文件名列表。
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'
如果我们忽略案例参考编号具有多个非零数字的可能性,则这无法处理完全缺少案例编号的文件名。否则它会提取客户参考号。
给定这些文件名:
$ 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