Command-Line

根據列合併兩個文件,文件 1 的列中第 n 次出現的字元串與第 n 次出現合併

  • October 9, 2015

合併取決於一列的兩個文件,第 n 次出現在第 1 列的字元串file1應與第 n 次出現在第 1 列的相同字元串合併file2。我嘗試加入,但結果不如預期。

join <(sort file1) <(sort file2)| column -t | tac | sort | uniq > file3

文件 1

CAAX-MC oracle.log.ApplicationScript 1 7 CRM
CAAZ-TEST-MC oracle.log.ApplicationScript 1 7 CRM
DAA   oracle.log.ApplicationScript 1 7 CRM
DJF oracle.log.ApplicationScript 1 6 CRM
DJF oracle.apps.appslogger 5 6 CRM

文件 2

CAAX-MC CRMDomain
CAAZ-TEST-MC CRMDomain
DJF CRMDomain
DJF CommonDomain,CRMDomain,FinancialDomain

文件 3 - 所需的輸出:

CAAX-MC oracle.log.ApplicationScript 1 7 CRM CRMDomain
CAAZ-TEST-MC oracle.log.ApplicationScript 1 7 CRM CRMDomain
DAA   oracle.log.ApplicationScript 1 7 CRM 
DJF oracle.log.ApplicationScript 1 6 CRM CRMDomain
DJF oracle.apps.appslogger 5 6 CRMCommonDomain,CRMDomain,FinancialDomain

使用awk

awk 'FNR==NR{a[NR-1]=$0} 
 FNR!=NR{for(i in a){split(a[i],x," ");
   if(x[1]==$1){$0=$0" "x[2];delete a[i];break}}print;}' file2 file1

注意參數 order: file2is before file1

  • FNR==NR: 僅適用於第一個文件(在參數列表中):file2.

    • a[NR-1]=$0``a:用 的行填充數組file2
  • FNR!=NR: 適用於file1

    • for(i in a): 循環遍歷先前創建的數組a
    • split(a[i],x," "): 在空間分割值(行file2)並將其儲存在新數組中,名稱為x
    • if(x[1]==$1)``x:如果( )的第一個元素x[1]等於(如果在數組中找到第一個欄位)的第一個欄位 ( $1),則:file1
    • $0=$0" "x[2]設置要在末尾列印新值的行x[2]
    • delete a[i];break由於您希望該索引再次出現在file1(例如DJF)中時下一次出現,因此我們需要刪除數組的該元素a並退出 for 循環(break)。
    • print: 是否在數組中找到元素無關緊要,file1無論如何都應該列印 (of ) 行。

輸出:

CAAX-MC oracle.log.ApplicationScript 1 7 CRM CRMDomain
CAAZ-TEST-MC oracle.log.ApplicationScript 1 7 CRM CRMDomain
DAA   oracle.log.ApplicationScript 1 7 CRM
DJF oracle.log.ApplicationScript 1 6 CRM CRMDomain
DJF oracle.apps.appslogger 5 6 CRM CommonDomain,CRMDomain,FinancialDomain

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