我有兩個具有相同鍵列的檔案,基于此我必須用另一個檔案更新一個檔案。你能幫我在shell腳本中為此撰寫邏輯嗎?
例子:
src 檔案:
------- -------
|call_id|call_nm|
------- -------
| 100| QC|
| 105| XY|
| 110| NM|
| 115| AB|
------- -------
lkp 檔案:
------- -------
|call_id|call_nm|
------- -------
| 100| QZ|
| 105| XY|
| 106| XZ|
| 115| JQ|
------- -------
在上面的示例中,我必須匹配兩個檔案并src_File根據lkp_file. 我們有 key_column - call_id。
首先檢查 key_column,然后更新 src_file 中的值。最終的輸出應該是這樣的——
src 檔案:
------- -------
|call_id|call_nm|
------- -------
| 100| QZ|
| 105| XY|
| 110| NM|
| 115| JQ|
------- -------
您可以看到 100 和 115 的值已根據 lkp_file 值發生變化。
uj5u.com熱心網友回復:
試試這個(在執行這個命令之前備份你的原始檔案):
grep -Eo '[0-9]{3,3}|[A-Z]{2,2}' lkp | xargs -n2 | xargs -I {} bash -c 'o=$(echo {}); n=(${o}); id=${n[0]}; nm=${n[1]}; sed -i "s/\($id|\ *\).*|/\1$nm|/" src'
'[0-9]{3,3}|[A-Z]{2,2}': 提取id和nmxargs -n2: 創建像100 QZ這樣的對-I {} bash -c: 處理對id和nm變數的sed命令"s/\($id|\ *\).*|/\1$nm|/":只適合您的檔案格式| 100| QC|,只需替換之前的nm|,或者您可以使用您想要的模式,例如[A-Z]
uj5u.com熱心網友回復:
使用 awk:
awk -F\| '{if(NR==FNR){a[$2]=$0}else{if($2 in a)$0=a[$2];print}}' lkp_file src_file
------- -------
|call_id|call_nm|
------- -------
| 100| QZ|
| 105| XY|
| 110| NM|
| 115| JQ|
------- -------
uj5u.com熱心網友回復:
建議awk腳本:
script.awk
BEGIN {FS = OFS = "|"} # set awk field seperator and output field seperator to |
NR == 1 {footer = $0} # read footer
NR < 4 {header = header ORS $0; next} # read and ignore header
FNR == NR {arr[$2] = $3; next} # read array from 1st file
$2 in arr {arr[$2] = $3} # update arra if found id in file2
END { # output the formated array
print header;
asorti(arr,arrSorted); # sort array indexes in arrSorted
for (i in arrSorted) { # for each element in sorted array
if (arrSorted[i] == "") continue; # ignore empty element
print OFS arrSorted[i] OFS arr[arrSorted[i]] OFS; # print current element
}
print footer;
}
跑步script.awk
awk script.awk src_file.txt lkp_file.txt
輸出:
------- -------
|call_id|call_nm|
------- -------
| 100| QZ|
| 105| XY|
| 110| NM|
| 115| JQ|
------- -------
請注意輸出是正確的并按順序排序id。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/482065.html
