Shell 比较两个列表,并在第三个列表上输出差异

Shell 比较两个列表,并在第三个列表上输出差异

我有两个文本文件,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将输出三个制表符分隔的列:

  1. 仅在第一个文件中的行,
  2. 仅在第二个文件中的行,并且
  3. 两个文件中都存在行。

awk脚本会将前两列中包含某些内容的任何输入分类为“不匹配”并输出1,如果第三列中包含某些内容,则会输出0匹配项。

请注意,comm需要对两个文件进行排序。

答案4

这是另一个awk解决方案

awk '1,$0=system("grep -qx "$1" b.txt")' a.txt

相关内容