我正在尝试提取部分文件名以与其他文件名进行比较,因为它是唯一不会更改的部分。这是模式和示例
clearinghouse.doctype.payer.transID.processID.date.time EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403
所有部分的长度始终相同,但清算所和& doctype可以在字符长度上有所不同。
我需要进行比较的文件名部分是transID。
在shell脚本中执行此操作的最简洁方法是什么?
由于
答案 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]'`