我在 AIX 上使用 ksh。
我有一個包含多個逗號分隔欄位的檔案。每個欄位的值被讀入腳本內的一個變數。
檔案中的最后一個欄位可能包含多個 | 分隔值。我需要測驗每個值并保留第一個不以 R 開頭的值,然后停止測驗這些值。
$principal_diagnosis0 R65.20|A41.9|G30.9|F02.80 的樣本值
我試過了:
echo $principal_diagnosis0 | awk -F"|" '{for (i = 1; i<=NF; i ) {if ($i !~ "R"){echo $i; primdiag = $i}}}'
但我收到這條訊息:awk:欄位 $i 不正確。
我的目標是有一個變數,我可以在分配第一個非 R 代碼的 awk 陳述句之外使用它(在本例中為 A41.9)。
echo $principal_diagnosis0 | awk -F"|" '{for (i = 1; i<=NF; i ) {if ($i !~ "R"){print $i}}}'
得到我的輸出:A41.9 G30.9 F02.80
所以我知道它正在讀取值并正確評估。但我需要在第一場比賽后停下來,并能夠在 awk 之外使用該值。
謝謝!
uj5u.com熱心網友回復:
要回答您的具體問題:
$ principal_diagnosis0='R65.20|A41.9|G30.9|F02.80'
$ foo=$(echo "$principal_diagnosis0" | awk -v RS='|' '/^[^R]/{sub(/\n/,""); print; exit}')
$ echo "$foo"
A41.9
以上內容適用于任何 awk,如果你有 GNU awk,你可以更簡單地完成它:
foo=$(echo "$principal_diagnosis0" | awk -v RS='[|\n]' '/^[^R]/{print; exit}')
uj5u.com熱心網友回復:
你可以FS做OFS所有艱苦的作業:
echo "${principal_diagnosis0}" |
mawk NF=NF FS='^(R[^|] [|]) |[|]. $' OFS=
A41.9
—————————————————————————————————————————————
同一概念的另一個稍微不同的變體——覆寫欄位但保持OFS原樣:
gawk -F'^.*R[^|] [|]|[|]. $' '$--NF=$--NF'
A41.9
這行得通,因為當你打破它時:
gawk -F'^.*R[^|] [|]|[|]. $' '
{ print NF
} $(_=--NF)=$(__=--NF) { print _, __, NF, $0 }'
3
1 2 1 A41.9
您會注意到您從 開始NF = 3,隨后的兩個遞減使其等效于$1 = $2,
但由于 finalNF現在減少到只有 1,它會正確列印出來而不是 2 個副本
……這意味著你也可以做到$0 = $2,例如:
gawk -F'^.*R[^|] [|]|[|]. $' '$-_=$-—NF'
A41.9
—————————————————————————————————————————————
第三種變體,這次使用RS代替FS:
mawk NR==2 RS='^.*R[^|] [|]|[|]. $'
A41.9
—————————————————————————————————————————————
如果您真的不想惹麻煩FS/OFS/RS,請gsub()改用:
nawk 'gsub("^.*R[^|] [|]|[|]. $",_)'
A41.9
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/473844.html
