匹配另一个文件中的一个文件的字符串,提取参数并填充第一个文件中的新列

时间:2016-02-01 22:00:04

标签: regex bash awk

我有两个文件

文件1

307201       00608670         5.70283
300048       fff0002a8        5.57004
300001       00608690         5.56917
300001       00608678         5.56917
150032       fff0002c8        2.78517
150028       fff0002c0        2.78509
150027       fff0002b8        2.78508
150024       fff0002d0        2.78502

file2的

raw symbol [ 170]: GLO FUN : svma 0x00608690, sz  133  mem_mgr_init
rec(t) [ 170]:            val 0x00608690, sz  133  mem_mgr_init
raw symbol [ 171]: GLO OBJ : svma 0x0000608670, sz    8  angleCounter
rec(d) [ 171]:            val 0x0000608670, sz    8  angleCounter
raw symbol [ 172]: GLO FUN : svma 0x0000402e00, sz   16  th_signal_finished
rec(t) [ 172]:            val 0x0000402e00, sz   16  th_signal_finished
raw symbol [ 173]: GLO FUN : svma 0x0000403da0, sz  133  xlate_nl_inplace
rec(t) [ 173]:            val 0x0000403da0, sz  133  xlate_nl_inplace
raw symbol [ 174]: GLO FUN : svma 0x0000402eb0, sz   19  th_report_results
rec(t) [ 174]:            val 0x0000402eb0, sz   19  th_report_results
raw symbol [ 175]: GLO FUN : svma 0x0000400c40, sz   97  GetTestData
rec(t) [ 175]:            val 0x0000400c40, sz   97  GetTestData
raw symbol [ 176]: GLO FUN : svma 0x0000401d20, sz  144  al_exit
rec(t) [ 176]:            val 0x0000401d20, sz  144  al_exit
raw symbol [ 177]: GLO FUN : svma 0x0000000000, sz    0  fgetc@@GLIBC_2.2.5

我需要搜索文件2中file1的第二列中的每个条目,并找到相关的符号名称(文件2的12美元)并将其添加为file1中的第四列。对于未找到的条目,我需要将其标记为NotFound。 期望的输出文件是这样的

307201       00608670         5.70283    angleCounter
300048       fff0002a8        5.57004    NotFound
300001       00608690         5.56917    mem_mgr_init
300001       00608678         5.56917    NotFound
150032       fff0002c8        2.78517    NotFound
150028       fff0002c0        2.78509    NotFound
150027       fff0002b8        2.78508    NotFound
150024       fff0002d0        2.78502    NotFound

我使用了下面的awk命令,但部分工作。它打印第二列中的每个条目及其与file2相关联的字符串。但是,它不是第二列中的字符串顺序,而是每个字符串出现在第二个文件中的顺序。

awk 'NR==FNR{a[$2];next} {for (i in a) if ($0 ~ i) {if ($12) print i"\t"$12;break;}}' file1 file2

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

$ cat tst.awk               
NR==FNR {
    key = $(NF-3)
    gsub(/^0x0*|,$/,"",key)
    map[key] = $NF
    next
}
{
    key = $2
    sub(/^0+/,"",key)
    print $0, (key in map ? map[key] : "NotFound")
}

$ awk -f tst.awk file2 file1
307201       00608670         5.70283 angleCounter
300048       fff0002a8        5.57004 NotFound
300001       00608690         5.56917 mem_mgr_init
300001       00608678         5.56917 NotFound
150032       fff0002c8        2.78517 NotFound
150028       fff0002c0        2.78509 NotFound
150027       fff0002b8        2.78508 NotFound
150024       fff0002d0        2.78502 NotFound