我有两个文本文件,a.txt 和 b.txt,其中:
a.txt
1
2
3
4
5
b.txt
3
5
我想要 c.txt,其中匹配的数字将打印为“0”,不匹配的数字将打印为“1”。
1
1
0
1
0
我知道 comm 可以抑制/打印唯一的行,但是我如何才能获得上面的 c.txt ?
非常感谢。
答案1
如果您想混在一起diff
而不加入,这里还有另一个选择。
sdiff -l a.txt b.txt | sed -e 's/.*<.*/1/' -e 's/.*(.*/0/'
您可能可以sed
在那里得到一些更好的表达或使用更改它,awk
但这是一个快速的镜头,然后只需将其重定向到c.txt
答案2
正如 don_crissti 指出的那样,awk
它非常简单:
awk 'FNR==NR { match_nmbrs[$1]++; next;}
{if($1 in match_nmbrs)
print 0;
else
print 1; }
' b.txt a.txt
第一个{...}
条件仅适用于第一个文件中的记录,而第二个{...}
条件仅适用于第二个文件中的记录。在我看来,所有其他事情都是不言自明的。
答案3
awk
在输出上使用comm
:
$ comm a.txt b.txt | awk -F'\t' '$1 || $2 { print 1 } $3 { print 0 }'
comm
将输出三个制表符分隔的列:
- 仅在第一个文件中的行,
- 仅在第二个文件中的行,并且
- 两个文件中都存在行。
该awk
脚本会将前两列中包含某些内容的任何输入分类为“不匹配”并输出1
,如果第三列中包含某些内容,则会输出0
匹配项。
请注意,comm
需要对两个文件进行排序。
答案4
这是另一个awk
解决方案
awk '1,$0=system("grep -qx "$1" b.txt")' a.txt