Command-Line
根據列合併兩個文件,文件 1 的列中第 n 次出現的字元串與第 n 次出現合併
合併取決於一列的兩個文件,第 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:
file2
is beforefile1
。
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
)。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