我需要将文件中指定的模式列表与另一个文件进行比较,并仅报告包含模式的列的匹配部分

时间:2016-05-03 20:56:57

标签: linux search awk grep

我需要将文件(file1)中指定的字符串列表与另一个文件(file2)进行比较,并使用linux仅报告包含字符串和另一列的匹配部分

以下是一个例子:

包含要搜索的字符串的文件-file 1如下所示

Name

Laura

Caroline

Chan

Carol

要搜索的文件 - file2:

Name                        Title             Salary 

George                     Research fellow      48000

Vanesse, Laura , Robert    Graduate student     20000

Patrick, Simon             Data Analyst         58000

Caroline              Administrative assistant  52000

Allison, Treacey, Chan   Research Technician    60000

Carol, John                Lab Managers         70000

下面是必需的输出(名称列只包含匹配的条目(请注意,此列在某些行中包含逗号分隔值,但我只需要输出中名称列的匹配条目)和单独的工资列:

Name        Salary

Laura       20000

Caroline    52000

Chan        60000

我想使用linux命令执行此任务。可以使用linux grep / awk命令完成吗?

关于要求的补充说明:

部分匹配:不行 我的列之间的空格:标签

谢谢!

3 个答案:

答案 0 :(得分:0)

awk是一个很好的工具:

$ awk 'BEGIN{print "name salary"} FNR==NR{a[$1]; next} {for (name in a) if ($0~name) print name,$NF}' file1 file2
name salary
Laura 20000
Caroline 52000
Chan 60000

如何运作

  • BEGIN{print "name salary"}

    打印出标题

  • FNR==NR{a[$1]; next}

    在读取第一个文件时,会将每个名称保存为关联数组a中的键。然后跳过其余命令并跳转到next行。

  • for (name in a) if ($0~name) print name,$NF

    如果我们到这里,我们正在阅读第二个文件。如果在输入行name中找到数组a中的任何$0,那么我们会打印该名称以及该行上的最后一个字段,表示为$NF

仅匹配全名

awk 'BEGIN{print "name salary"} FNR==NR{a[$1]; next} {n=NF; for (name in a) for (i=1;i<=n;i++) {if ($i~("^"name",?$")) print name,$NF; if ($i~/,/)n=i+1}}' file1 file2

答案 1 :(得分:0)

在您的姓名文件

上修复类型后
// global declaration
var context = null;
$(document).ready(function(){
//keep your logic here 

}); 
 function clear1(){
    context.clearRect(0, 0, context.canvas.width, context.canvas.height);
 }

仅检查每条记录中的名称,而不检查标题。

答案 2 :(得分:0)

你的问题有很多含糊之处,但这可能是你想要的:

$ cat tst.awk
NR==1 { print $1, $NF; next }
NR==FNR {
    n = split($0,names,/[[:space:]]*,[[:space:]]*/)
    sub(/[[:space:]].*/,"",names[n])
    for (i=1; i<=n; i++) {
        #print "<" names[i] ">"
        name2sal[names[i]] = $NF
    }
    next
}
$1 in name2sal { print $1, name2sal[$1] }

$ awk -f tst.awk file2 file1 | column -t
Name      Salary
Laura     20000
Caroline  52000
Chan      60000