2

我正在尝试提取文件名的一部分以与其他文件名进行比较,因为它是唯一不变的部分。这是模式和示例

clearinghouse.doctype.payer.transID.processID.date.time EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403

所有部分的长度始终相同,但字符长度可能不同的票据交换所和文档类型除外。

我需要比较的文件名部分是 transID。

在 shell 脚本中执行此操作的最简洁、最短的方法是什么。

谢谢

4

4 回答 4

1

有很多方法可以做到这一点,简单任务最简单的工具是 cut 命令。Tell cut 你想用什么字符作为分隔符以及你想打印哪些字段。这是执行您想要的命令。

file=EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403
transitId=$(echo $file | cut -d. -f4)

awk 可以做同样的事情,也可以让你做更复杂的逻辑。

file=EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403
transitId=$(echo $file | awk -F. '{print $4}')
于 2012-09-25T18:25:41.133 回答
1

read您可以使用该命令使用适当的值来拆分文件名IFS

filename="EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403"
IFS="." read clHouse doctype payer transID procID dt tm <<< "$filename"
echo $transID

由于您只需要事务 ID,因此将每个部分分配给特定变量是多余的。对其他字段使用单个虚拟变量:

# You only need one variable after transID to swallow the rest of the input without
# splitting it up.
IFS="." read _ _ _ transID _  <<< "$filename"

或者只是将每个部分读入一个数组并访问正确的元素:

IFS="." read -a parts <<< "$filename"
transID="${parts[3]}"
于 2012-09-26T02:09:10.560 回答
0

您可以通过参数扩展来做到这一点:

$ foo=EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403
$ bar=${foo%.[0-9]*.[0-9]*.[0-9]*}
$ echo "${bar##*.}"
1234567890123456789
于 2012-09-25T18:26:02.323 回答
0
tranid==`echo file_name|perl -F -ane 'print $F[3]'`
于 2012-09-26T02:15:13.663 回答