병합은 열의 두 파일에 따라 달라지며, 열 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]=$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
)를 종료해야 합니다.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