使用多个部分提取文件名的一部分

时间:2012-09-25 18:22:27

标签: bash shell

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

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

所有部分的长度始终相同,但清算所和& doctype可以在字符长度上有所不同。

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

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

由于

4 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,简单任务最简单的工具就是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}')

答案 1 :(得分: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]}"

答案 2 :(得分:0)

您可以使用参数扩展来执行此操作:

$ foo=EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403
$ bar=${foo%.[0-9]*.[0-9]*.[0-9]*}
$ echo "${bar##*.}"
1234567890123456789

答案 3 :(得分:0)

tranid==`echo file_name|perl -F -ane 'print $F[3]'`