我正在嘗試根據檔案中引數的條目從序列中提取一個值。就我而言,這些值將是“seq”、“date”或“count”。
function ParseHeader {
local varHeaderLine=$1
local varType=$2
local varOut=""
if [[ -z "$varType" ]]; then
echo "Cannot find! - ($varType)"
exit 1
elif [[ "$varType" = "seq" ]]; then
varOut=$(echo "$varHeaderLine" | cut -d\| -f 3)
echo "Sequence: $varOut"
elif [[ "$varType" = "date" ]]; then
varOut=$(echo "$varHeaderLine" | cut -d\| -f 4)
echo "Date: $varOut"
elif [[ "$varType" = "count" ]]; then
varOut=$(echo "$varHeaderLine" | cut -d\| -f 5)
echo "Line Count: $varOut"
else
echo "Invalid input! Your Header is: $varHeaderLine"
fi
return $?
}
sequence='XXXXX|Y|1|20220429|9999'
ProfSeq=$(ParseHeader "${sequence}" "count")
echo $ProfSeq
這是整個檔案的一部分,但這里發生的是我將接收一個檔案,提取其序列,然后從該特定序列中提取一些值。感謝您的幫助,這就是我最終的結果。現在,如果可能的話,我正在尋找它的 CPU 密集度較低。
注意:這篇文章是臨時檔案腳本,它將每天為不同環境中的不同服務器運行
uj5u.com熱心網友回復:
只關注當前的代碼...
假設/理解:
- 該變數
ProfSeq將包含函式echo呼叫的輸出;我們可以消除子行程呼叫(ProfSeq=$( ... subprocess call ...)我們可以通過用函式替換echo "..."呼叫ProfSeq="...") (即,讓函式直接填充ProfSeq變數 - 通過消除對 split 的雙重子流程呼叫,可以獲得額外的性能改進
varHeaderLine使用內置函式消除對 split ($(echo ... | cut ...))bash/read
函式重寫的一個想法:
ParseCOTHeader () {
local varHeaderLine=$1
local -l varType=$2 # force to all lowercase
local ignore1 ignore2 in_seq in_date in_count rc
# split varHeaderLine into 5 variables based on '|' delimiter:
# NOTE: assumes varHeaderLine has exactly 5x '|' delimited fields otherwise OP
# may want to add some code to validate the structure of varHeaderLine
IFS='|' read -r ignore1 ignore2 in_seq in_date in_count <<< "${varHeaderLine}"
# reset variables:
ProfSeq=
rc=0
if [[ -z "${varType}" ]]
then
ProfSeq="Cannot find! - ($2)" # since varType=$2 is empty at this point we will always print '()' ... ?
rc=1
else
case "${varType}" in
seq) ProfSeq="Sequence: ${in_seq}" ;;
date) ProfSeq="Date: ${in_date}" ;;
count) ProfSeq="Line Count: ${in_count}" ;;
*) ProfSeq="Invalid input! Your Header is: '$varHeaderLine'"
rc=1 ;;
esac
fi
return "${rc}"
}
逐步完成該功能:
$ sequence='SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" 'seq'
$ echo "$? : ${ProfSeq}"
0 : Sequence: 1
$ ParseCOTHeader "${sequence}" 'DaTe'
$ echo "$? : ${ProfSeq}"
0 : Date: 20220429
$ ParseCOTHeader "${sequence}" 'COUNT'
$ echo "$? : ${ProfSeq}"
0 : Line Count: 9999
$ ParseCOTHeader "${sequence}" 'fire-truck'
$ echo "$? : ${ProfSeq}"
1 : Invalid input! Your Header is: 'SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" ''
$ echo "$? : ${ProfSeq}"
1 : Cannot find! - ()
如果重復呼叫函式需要將訊息字串保存在不同的變數中:
- 添加行
local -n myoutput=$3在函式的頂部myoutput(這定義了一個本地 nameref 變數作為指向 $3 中傳遞的變數名的指標) - 全部替換
ProfSeq="..."為myoutput="..."用函式中的 - 洗掉函式中的行
ProfSeq=(變數重置)
將新函式用于測驗旋轉:
$ sequence='SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" 'seq' ProfSeq
$ echo "$? : ${ProfSeq}"
0 : Sequence: 1
$ ParseCOTHeader "${sequence}" 'DaTe' ProfSeq
$ echo "$? : ${ProfSeq}"
0 : Date: 20220429
$ ParseCOTHeader "${sequence}" 'COUNT' ProfSeq
$ echo "$? : ${ProfSeq}"
0 : Line Count: 9999
$ ParseCOTHeader "${sequence}" 'fire-truck' SomeOtherVar
$ echo "$? : ${SomeOtherVar}"
1 : Invalid input! Your Header is: 'SWHHR|H|1|20220429|9999'
$ ParseCOTHeader "${sequence}" '' YetAnotherVar
$ echo "$? : ${YetAnotherVar}"
1 : Cannot find! - ()
uj5u.com熱心網友回復:
您可以使用read關聯陣列:
$ function ParseHeader {
local -A fields=(["seq"]=2 ["date"]=3 ["count"]=4)
local -A mess=(["seq"]="Sequence" ["date"]="Date" ["count"]="Line Count")
IFS='|' read -ra arr <<< "$1"
if [[ -n "${fields[$2]: x}" ]]; then
printf -v ProfSeq '%s: %s' "${mess[$2]}" "${arr[${fields[$2]}]}"
else
printf -v ProfSeq 'Invalid input! Your Header is: %s' "$1"
fi
}
$ ParseHeader "XXXXX|Y|1|20220429|9999" "seq"
$ echo "$ProfSeq"
Sequence: 1
$ ParseHeader "XXXXX|Y|1|20220429|9999" "date"
$ echo "$ProfSeq"
Sequence: 20220429
$ ParseHeader "XXXXX|Y|1|20220429|9999" "count"
$ echo "$ProfSeq"
Line Count: 9999
$ ParseHeader "XXXXX|Y|1|20220429|9999" "foo"
$ echo "$ProfSeq"
Invalid input! Your Header is: 31
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/472115.html
