2

変更されない唯一の部分であるため、ファイル名の一部を抽出して他のファイル名と比較しようとしています。ここにパターンと例があります

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

すべてのセクションは常に同じ長さですが、クリアリングハウスと doctype は文字の長さが異なる場合があります。

比較に必要なファイル名の部分は、transID です。

シェルスクリプトでこれを行うための最もクリーンで最短の方法は何でしょうか.

ありがとう

4

4 に答える 4

1

readに適切な値を使用してコマンドを使用すると、ファイル名を分割できますIFS

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

必要なのはトランザクション ID だけなので、すべての部分を特定の変数に割り当てるのはやり過ぎです。他のフィールドには 1 つのダミー変数を使用します。

# 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 に答える
1

これを行うには多くの方法がありますが、単純なタスクを実行する最も簡単なツールはカット コマンドです。区切り記号として使用する文字と、印刷するフィールドをカットします。これがあなたが望むことをするコマンドです。

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 に答える
0
tranid==`echo file_name|perl -F -ane 'print $F[3]'`
于 2012-09-26T02:15:13.663 に答える
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 に答える