合并取决于列的两个文件,第 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
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