我有两个列表,第一个列表包含所有名称
$ 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*