Awk

用循環中的變數替換特定欄位中的文本

  • June 24, 2022

我有一個巨大的文件要解析並需要搜尋和替換文本,但在特定欄位中,共享一個名為 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或)的值。$4e,從id數組中column#1+column#4的匹配鍵組合文件dest,如果找到則返回該值(),否則複製其目前值。id[$1, $4]

引用自:https://unix.stackexchange.com/questions/707263