Awk
用循環中的變數替換特定欄位中的文本
我有一個巨大的文件要解析並需要搜尋和替換文本,但在特定欄位中,共享一個名為 dest 的小樣本以供參考。第一行是標題供參考。
cat dest ID|NAME|COMPANY|NUMBER 1001|Adam||15001 1002|eve|adam&eve|15002 1003||| 1004|||50000 1005|||50001
我有單獨的文件,其中包含要匹配的模式、要替換的文本和要替換的文本
cat src 1003||15003 1004|50000|15004 1005|50001|15005
所以我可以使用 sed 執行下面給定的 while 循環來實現 src 文件中的最後 2 行。
cat src | while IFS=$'|'; read id old new; do sed -i "/^${id}/s/${old}/${new}/" dest; done
但是對於
ID=1003
我得到空字元串$old
,它將替換該ID的dest文件中的所有空列。我想避免。我想要做的是只替換最後一個欄位。期望:
ID|NAME|COMPANY|NUMBER 1001|Adam||15001 1002|eve|adam&eve|15002 1003|||15003 1004|||15004 1005|||15005
當涉及到柱狀數據時,我可以使用 awk,因為它更細化。但據我了解,awk 會多次列印到標準輸出,這在我的情況下也不實用。
那麼有沒有一種方法可以讓我以簡潔明了的方式做到這一點?
awk 'BEGIN{ FS=OFS="|" } NR==FNR { id[$1, $2]=$3; next } { $4=( ($1, $4) in id? id[$1, $4]: $4) } 1' src dest
- FS :欄位分隔符
- OFS :輸出欄位分隔****符_
- NR==FNR:第一個輸入文件的始終為真條件習語。
NR表示awk讀取的記錄總數;****FNR是
每個單獨文件的記錄數。
id[$1, $2]=$3
: 關聯的 awk 數組。名稱:id
鍵:column#1+column#2
值:column#3
第一個塊僅針對第一個輸入文件執行,即。e,文件src。
在此,我們正在更新第二個文件 i
$4=($1, $4) in id? id[$1, $4]: $4
的最後一列($NF
或)的值。$4
e,從id數組中column#1+column#4的匹配鍵組合文件dest,如果找到則返回該值(),否則複製其目前值。id[$1, $4]