Awk 两个文件,两个字段匹配并替换为新文件

Awk 两个文件,两个字段匹配并替换为新文件,awk,substitution,Awk,Substitution,遇到一个脑残,我正在寻求指导/提示。我有两个文件,我需要检查两个字段的值,比较它们,如果它们匹配,将它们放入第三个文件: 文件一: tail -n 1 file_A 09/03/2013:11:55:49 S 7187187187@2.3.4.5 9999999@6.7.8.9 ThisPlace:Washington 0 09/03/2013:12:05:27 578 文件二: head -n 2 file_B 7187187187,"OfficeA" 9999999,"OfficeB"

遇到一个脑残,我正在寻求指导/提示。我有两个文件,我需要检查两个字段的值,比较它们,如果它们匹配,将它们放入第三个文件:

文件一:

tail -n 1 file_A

09/03/2013:11:55:49 S 7187187187@2.3.4.5 9999999@6.7.8.9 ThisPlace:Washington 0 09/03/2013:12:05:27 578
文件二:

head -n 2 file_B
7187187187,"OfficeA"
9999999,"OfficeB"
预期结果:

more desired_result
09/03/2013:11:55:49 S 7187187187@OfficeA 9999999@OfficeB ThisPlace:Washington 0 09/03/2013:12:05:27 578
我考虑在每个实例的循环中匹配一个shell脚本,但我确信有一种方法可以使用awk在一行中匹配两个字段

awk -F"@" 'NR==FNR{a[$1]=$2;next}{if ($2 in a)print a[$2]";"$0}'  fileA fileB 
不,我已经尝试了各种不同的差异,FS,NR组合到我被难倒的地方,我确信我忽略了一些东西

已编辑

@约特

$ more fileA
08/22/2013:09:21:33 E 9876543210@10.25.50.33 3333444488@10.100.10.3 EProv:EastProvidence_RI 1 08/22/2013:09:21:33 0
09/03/2013:05:09:58 S 5556666777@10.30.239.18 8877887788@10.50.25.1 Tacoma:Washington 0 09/03/2013:13:29:31 29973
09/03/2013:10:46:19 S 3333444488@10.11.12.13 7777777777@10.17.19.2 Boston:MA 0 09/03/2013:12:01:28 4509
09/03/2013:10:49:54 S 1111122222@10.20.30.1 99999888888@10.20.30.1 Gaith:MD 0 09/03/2013:12:09:26 4772
09/03/2013:10:49:54 S 1111122222@10.20.30.1 57778889999@10.20.30.1 Balt:MD 1 09/03/2013:12:09:26 4772

$ more fileB
3333444488,"Providence_Route"
5556666777,"Kenosha_Route"
9999988888,"Chitown_Route"
7778889999,"Chitown_Route"

这里是它的要点。这些是我正在尝试匹配的电话号码(CDR)。我在文件B中列出的数字结构如下:

telnumber,"Which_Session_Border_Controller_Its_Routing_Through"
我想说的是:在fileA中查找所有这些数字:在fileB中查找,如果您看到fileA的$3或$4匹配,请将@符号后面的任何数字替换为路线名称

虽然对我来说,仅仅
perl-pi-e's:10.20.30.1:ChitownRoute:g'fileA似乎更容易,但我使用的地址是经过消毒的,并且会波动,因此即使试图修复这些地址本身也是一件令人头痛的事。我会发布更多的例子,但fileA是1GB,fileB大约有44k行

试试这个:

awk -F'[, ]' '
NR==FNR{
    gsub(/\"/,"",$2);
    a[$1]=$2; 
    next
}   
{
    split($3,t,/@/);
    $3=t[1]"@"a[t[1]];
    split($4,t,/@/);
    $4=t[1]"@"a[t[1]]
}1' fileb filea
09/03/2013:11:55:49 S 7187187187@OfficeA 9999999@OfficeB ThisPlace:Washington 0 09/03/2013:12:05:27 578

这是一个
awk
版本:

awk 'FNR==NR {split($1,f,"[,\"]");a[f[1]]=f[3];next} {for (i in a) for (j=1;j<=NF;j++) if ($j~i) $j=i"@"a[i]}1' fileB fileA
09/03/2013:11:55:49 S 7187187187@OfficeA 9999999@OfficeB ThisPlace:Washington 0 09/03/2013:12:05:27 578
fileB

7187187187,"OfficeA"
9999999,"OfficeB"
这使得:

09/03/2013:11:55:49 7187187187@OfficeA 9999999@OfficeB ThisPlace:Washington 0 09/03/2013:12:05:27 578

来自新文件的结果:

08/22/2013:09:21:33 E 9876543210@10.25.50.33 3333444488@Providence_Route EProv:EastProvidence_RI 1 08/22/2013:09:21:33 0
09/03/2013:05:09:58 S 5556666777@Kenosha_Route 8877887788@10.50.25.1 Tacoma:Washington 0 09/03/2013:13:29:31 29973
09/03/2013:10:46:19 S 3333444488@Providence_Route 7777777777@10.17.19.2 Boston:MA 0 09/03/2013:12:01:28 4509
09/03/2013:10:49:54 S 1111122222@10.20.30.1 9999988888@Chitown_Route Gaith:MD 0 09/03/2013:12:09:26 4772
09/03/2013:10:49:54 S 1111122222@10.20.30.1 7778889999@Chitown_Route Balt:MD 1 09/03/2013:12:09:26 4772

回答:非常感谢。我将在本地对其进行分解分析。欣赏help@munkeyoto不客气。如果你在理解任何作品时有困难,请随时发表评论。因为我主要使用内置的,所以这是一种自我解释。唯一的关键是交换文件。我们先读取文件B,创建了一个哈希映射,然后读取文件a并进行了替换。@munkeyoto如果信息位于行的不同位置,此解决方案将不起作用,但如果信息总是固定的,则可能没问题。这将打印出@@@@@@@munkeyoto以查看我的测试文件。你还有其他数据吗?我编辑了原始问题,这样你就可以看到它的来源和我的困境。@munkeyoto你的新数据在我的
awk
程序中运行良好。如果
B
文件中的一对没有命中,JS解决方案将失败。怪异只是在我的文件中打印@symbols(使用awk v 20110810 FreeBSD)
09/03/2013:11:55:49 7187187187@OfficeA 9999999@OfficeB ThisPlace:Washington 0 09/03/2013:12:05:27 578
08/22/2013:09:21:33 E 9876543210@10.25.50.33 3333444488@Providence_Route EProv:EastProvidence_RI 1 08/22/2013:09:21:33 0
09/03/2013:05:09:58 S 5556666777@Kenosha_Route 8877887788@10.50.25.1 Tacoma:Washington 0 09/03/2013:13:29:31 29973
09/03/2013:10:46:19 S 3333444488@Providence_Route 7777777777@10.17.19.2 Boston:MA 0 09/03/2013:12:01:28 4509
09/03/2013:10:49:54 S 1111122222@10.20.30.1 9999988888@Chitown_Route Gaith:MD 0 09/03/2013:12:09:26 4772
09/03/2013:10:49:54 S 1111122222@10.20.30.1 7778889999@Chitown_Route Balt:MD 1 09/03/2013:12:09:26 4772