我正在尝试提取文件名的一部分以与其他文件名进行比较,因为它是唯一不会更改的部分。 这是模式和示例
clearinghouse.doctype.payer.transID.processID.date.timeEMDEON.270.60054.1234567890123456789.70949996.20120925.014606403
所有部分在任何时候都是相同的长度,但Clearinghouse和DocType除外,其字符长度可能会有所不同。
我需要比较的文件名部分是 transID。
在 shell 脚本中执行此操作的最干净的最短方法是什么。
谢谢
方法可以做到这一点,简单任务的最简单工具是cut命令。 告诉 cut 您想用作 delemiter 的字符以及要打印的字段。 这是执行所需操作的命令。
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}')
<</div>
div class="one_answers"> 您可以使用适当的值使用 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]}"
您可以使用参数扩展来执行此操作:
$ foo=EMDEON.270.60054.1234567890123456789.70949996.20120925.014606403
$ bar=${foo%.[0-9]*.[0-9]*.[0-9]*}
$ echo "${bar##*.}"
1234567890123456789
tranid==`echo file_name|perl -F -ane 'print $F[3]'`