根据列合并两个文件,文件 1 的列中第 n 次出现的字符串将与第 n 次出现合并

根据列合并两个文件,文件 1 的列中第 n 次出现的字符串将与第 n 次出现合并

合并取决于列的两个文件,第 1 列中第 n 次出现的字符串file1应与 第 1 列中第 n 次出现的相同字符串合并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

答案1

使用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

注意参数顺序:file2 file1

  • FNR==NR: 仅适用于第一个文件(在参数列表中):file2.
    • a[NR-1]=$0a:用 的行填充数组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

答案2

如果在尝试之前已订购文件awk

awk '
    {
        a=$1                #store key field in var a
        b=$2                #store second field in var b
        do {
            getline <"test" #get line from test file
            if(l)           #if var l is not empty
                l=l"\n"$0   #add line to var l separated by newline
            else
                l=$0        #otherways(var l is empty) put line into var l
            }
        while(a!=$1)        #repeats above while key fields will be equal 
        print l,b           #prints stored lines + b part of first file
        l=""                #empty line store variable
     }' common_test.log

输出:

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

相关内容