열을 기준으로 두 파일을 병합하면 파일 1의 열 1에서 n번째 발생하는 문자열이 n번째 발생과 병합됩니다.

열을 기준으로 두 파일을 병합하면 파일 1의 열 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 '
    {
        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

관련 정보