Text-Processing
如何將file1中的值與file2中的值匹配並獲取相關資訊以添加到file1中?
我有 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$3
of ,然後將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>1 { $4=parentId[$3] }1' file2 file1