我需要将文件(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命令完成吗?
关于要求的补充说明:
部分匹配:不行 我的列之间的空格:标签
谢谢!
答案 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