Text-Processing

如何將file1中的值與file2中的值匹配並獲取相關資訊以添加到file1中?

  • April 27, 2022

我有 2 個文件,第一行是標題行供參考

  • file1
userId  userContact parentId  parentContact
200     0900200     100       -
201     0900201     100       -
300     0900300     101       -
  • file2
userId  userContact parentId  parentContact
100     0900100     100       -
101     0900101     100       -

我想填充 的第 4 列file1,以便它必須搜尋in $3of ,然後將from代替 of , 因此輸出應如下所示:file1``$1``file2``$2``file2``$4``file1

  • output
userId  userContact parentId  parentContact
200     0900200     100       0900100
201     0900201     100       0900100
300     0900300     101       0900101

我更喜歡awk,因為它會更快。

$ awk 'NR==FNR { keep[$1] = $2 ; next};
      FNR==1 {print;next};
      { $4 = keep[$3]; print }' file2 file1
userId  userContact parentId  parentContact
200 0900200 100 0900100
201 0900201 100 0900100
300 0900300 101 0900101

這讀入,將每行的欄位 2 儲存在一個名為(由欄位 1 的值索引)file2的數組中。keep一旦它讀完file2,它就開始讀file1。它列印第一行(標題行),然後對於每個後續輸入行,它將欄位 4 更改為 in 的值keep[$3]並列印它。

file2該腳本通過測試檢測它是否正在讀取NR==FNR。awk 的FNR變數包含目前文件的目前行號,而NR包含到目前為止讀取的所有文件的累積總行號。因此,如果 FNR 等於 NR,我們正在讀取第一個文件(即file2- 這就是它必須列為第一個文件名 arg 的原因)。在一些相當模糊的情況下,這個測試不能很好地工作,但在大多數情況下(包括這個)都可以。

如果需要更改輸入或輸出欄位分隔符,可以使用 awk 的 -F 和 -v 選項。例如-F'\t'和/或-v OFS='\t'

使用join(它需要排序的輸入文件,所以我們傳遞了排序的輸入)。

join -1 3 -2 1 -o 1.1,1.2,1.3,2.2 <(sort -k3 file1) <(sort file2)
200 0900200 100 0900100
201 0900201 100 0900100
300 0900300 101 0900101

使用-1 3, join從第一個輸入文件 (file1) 中選擇第 3 列作為鍵,並從第二個輸入文件 (file2) 中選擇第1-2 1列作為鍵;然後它輸出這些列*<file#>.<column#>*。-o

如果您的輸入是製表符分隔的文件,請添加-t$'\t'到 join 命令以及sort -k3 file1.

如果您想列印標題行,請head -n1 file1;在連接之前添加。


或使用awk

awk 'NR==FNR{ parentId[$1]=$2; next }
    FNR&gt;1  { $4=parentId[$3] }1' file2 file1

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