匹配两个列表并创建一个布尔列

匹配两个列表并创建一个布尔列

我有两个列表,第一个列表包含所有名称

$ cat file1.txt
dog_02
dog_01
dog_20
dog_22
dog_23
dog_24

我的第二个列表中有一些来自第一个列表的名字

$ cat file2.txt
dog_01
dog_23
dog_24

我想在两个列表之间进行配对并获得布尔输出

dog_02 
dog_01 dog_01
dog_20
dog_22
dog_23 dog_23
dog_24 dog_24

if (空) {print "0"} else {print "1"} ;完成 > boolean_output.txt

$ cat boolean_output.txt

dog_02   0
dog_01   1
dog_20   0
dog_22   0
dog_23   1
dog_24   1

谢谢你的时间

答案1

awk解决方案:

awk 'NR==FNR{ a[$1]; next }{ printf "%s\t%d\n",$1,($1 in a) }' file2.txt file1.txt > boolean_output.txt
  • { a[$1]; next }- 捕获第一个输入文件中的所有值,即file2.txt
  • ($1 in a)- 检查匹配的关键条件名字处理第二个输入文件时file1.txt

最终boolean_output.txt内容:

dog_02  0
dog_01  1
dog_20  0
dog_22  0
dog_23  1
dog_24  1

答案2

如同罗曼·佩雷克雷斯特的回答,但会以不同的方式产生0对于名称,如果仅在 file2 中也是唯一的,加上这是与输入到的文件无关的顺序awk,因此这将适用于目的是唯一名称的 N 个输入文件0并且重复的结果将是1意思是。

awk '{s[$1]=s[$1]?"1":"0"} END{for (x in s) print x,s[x]}' file*

相关内容