列に基づいて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

おすすめ記事