列に基づいて2つのファイルをマージすると、ファイル1の列1でn番目の文字列がn番目の発生とマージされます。

列に基づいて2つのファイルをマージすると、ファイル1の列1でn番目の文字列がn番目の発生とマージされます。

マージは列の2つのファイルによって異なります。列1からn番目に表示される文字列は、列1file1から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]最初のフィールドと同じ場合(最初のフィールドが配列に見つかった場合)$1file1
    • $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 '
    {
        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

関連情報