我正在嘗試匹配某個欄位并從以多個字符分隔的檔案中更新其資料。我正在使用它來模擬 SQL 的 UPDATE。這是使用 bash 創建迷你 DBMS 的更大專案的一部分。
我嘗試了什么:
sed "s/\^\_\^/:/g" $file_path | cut -d: -f1 | grep -nw SAR | sed "s/\^\_\^/:/g" | cut -d: -f2 | sed -i "s/$match/$update/g"
我的問題是我無法使用sed -i僅更新找到的這些特定列,因為您無法通過管道輸入它。
使用的分隔符是: ^_^
資料檔案示例:
'EGP'^_^'Egypt'
'SAR'^_^'Europe'
'SAR'^_^'Europe'
'SAR'^_^'Europe'
'SAR'^_^'Europe'
'Europe'^_^'SAR'
'SAR'^_^'Europe'
'MYR'^_^'Malaysia'
'MYR'^_^'Malasia'
例如,我$match可以是SAR$updateUSD
對資料檔案的預期更改
'EGP'^_^'Egypt'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'Europe'^_^'SAR'
'USD'^_^'Europe'
'MYR'^_^'Malaysia'
'MYR'^_^'Malasia'
如果有更好的不同方法,那也是受歡迎的,因為我對 bash 腳本還很陌生。
uj5u.com熱心網友回復:
最好在awk這里使用:
awk -v s="'SAR'" -v q="'USD'" -F'\\^_\\^' -v OFS='^_^' '$1==s {$1=q} 1' file
'EGP'^_^'Egypt'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'Europe'^_^'SAR'
'USD'^_^'Europe'
'MYR'^_^'Malaysia'
'MYR'^_^'Malasia'
解釋:
-v s="'SAR'"設定命令列變數s='SAR'-v q="'USD'"設定命令列變數s='USD'-F '\\^_\\^'將輸入欄位分隔符設定為^_^. 我們需要轉義,^因為這是一個特殊的正則運算式元字符,我們需要雙重轉義它,因為我們在一個字串中使用它,該字串稍后會轉換為正則運算式(欄位分隔符)。-v OFS='^_^'將輸出欄位分隔符設定為^_^$1 == s將第一個欄位與'SAR'$1 = q設定$1為變數'USD'
uj5u.com熱心網友回復:
使用 sed 您可以$match在字串的開頭使用^,并使用以下命令進行更改$update:
match="'SAR'"
update="'USD'"
sed "s/^$match\^_\^/$update^_^/" file
輸出
'EGP'^_^'Egypt'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'USD'^_^'Europe'
'Europe'^_^'SAR'
'USD'^_^'Europe'
'MYR'^_^'Malaysia'
'MYR'^_^'Malasia'
查看bash 演示。
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk程式。
awk -v matchvalue="'SAR'" -v updatedvalue="'USD'" '
match($0,"^"matchvalue"\\^_\\^"){
print updatedvalue"^_^" substr($0,RSTART RLENGTH)
next
}
1
' Input_file
說明:在示例中創建 2 個名為matchvalue和 的變數updatedvalue,'SAR'以及'USD'OP 顯示的值。然后在主程式中使用match函式來匹配一行是否以開頭,'SAR'^_^然后在其位置列印新值,然后列印該行的其余部分,如果該行不是從該行開始,'SAR'^_^則簡單地列印它。
uj5u.com熱心網友回復:
這就是我最終做的事情:
escaped_delm=$(echo $curr_delim | sed 's/[^^\\]/[&]/g; s/\^/\\^/g; s/\\/\\\\/g')
awk -F"$escaped_delm" -v a_col_update=$update_field -v pick=$p_tmp_field -v a_del="$match" -v a_ins="$insert" -v OFS="$curr_delim" '$pick==a_del {$a_col_update=a_ins} 1' $t_path > tmp && mv tmp $t_path
我面臨的最大問題是我將分隔符^_^作為變數傳遞給 awk。我的腳本假定我不知道變數是什么,并且它在腳本的開頭被傳遞給它。這會導致一個問題,就像第一個答案建議的-F選項awkthinks that ^is a regex argument。
這就是sed我使用的命令非常方便的地方!它通過轉義任何正則運算式元字符來清理分隔符。想感謝 Ed Morton 對我得到命令的這個問題的出色回答sed。
希望其他人覺得這很有用!
我的 awk 變數是:
curr_delim="^_^"a_col_update=<column number to be updated>pick=<column used to pick the record/row>a_del=<field to be updated from picked record/row>a_ins=<new value for the picked field>OFS="$curr_delim"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/407360.html
標籤:
下一篇:在多值變數的每個單詞中添加文本
