根據欄位配對合併 2 個文件

根據欄位配對合併 2 個文件

我想建立一個包含兩個輸入檔案中的列的檔案。文件1就像:

aa 32
bb 15
cc 78

文件2是:

fa 19
bc 23
cc 50
de 28
aa 45
bb 31

任務是,讀取 File1,如果一行的第一個欄位存在於 File2 的第一個欄位中,則列印 File2 的該行,以及兩列,並新增包含第一個欄位的 File1 的第二列條目。

輸出應該是這樣的:

aa 45 32
bb 31 15
cc 50 78

該腳本首選 awk。

答案1

$ awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1
aa 45 32
bb 31 15
cc 50 78

解釋:

awk隱式迴圈遍歷每個文件,一次一行。由於我們將其file2作為第一個參數,因此首先讀取它。 file1是第二個讀的。

  • FNR==NR{a[$1]=$2;next}

    NRawk是迄今為止已讀取的行數, 是目前檔案中迄今已讀取的FNR行數。awk因此,如果FNR==NR,我們仍在讀取第一個命名檔案:file2。對於 中的每一行file2,我們分配a[$1]=$2.

    這裡,a是一個關聯數組表示a[$1]=$2將 file2 的第二列(表示為 )儲存$2為陣列中的值,並a使用 file2 的第一列$1作為鍵。

    next告訴awk跳過其餘命令並從下一行開始。

  • ($1 in a) {print $1,a[$1],$2}

    如果我們到達這裡,則表示我們正在讀取第二個檔案:file1.如果我們在 中看到該行的第一個欄位file2(由 array 的內容決定)a,那麼我們會列印出一行,其中包含兩個檔案中欄位 2 的值。

答案2

我喜歡 awk 解決方案,但我認為這可能更容易:

sort file1 > sortedFile1
sort file2 > sortedFile2
join -o 1.1 2.2 1.2 sortedFile1 sortedFile2

此選項-o將覆蓋您選擇的第一個檔案的第一個欄位、第二個檔案的第二個欄位和第一個檔案的第二個欄位的格式。

答案3

將第二個文件加入File2第一個文件中,File1.

join <(sort -k1 file2) <(sort -k1 file1)

相關內容