如何区分两个文件列表并忽略列表中的位置

Nir*_*Nir 14 unix diff

我有两个文件列表,我想要差异.第二个列表中包含更多文件,因为当我对这两个列表进行区分时,它们都按字母顺序排列,我得到的文件(行)存在于两个列表中,但位于不同的位置.

我想区分这两个列表,忽略列表中的行位置.这样我只会获得列表中的新行或缺失行.

谢谢.

dog*_*ane 21

您可以尝试这种方法,包括"减去"两个列表,如下所示:

$ cat file1
a.txt
b.txt
c.txt

$ cat file2
a.txt
a1.txt
b.txt
b2.txt
Run Code Online (Sandbox Code Playgroud)

1)在file2中打印不在file1中的所有内容,即file2 - file1

$ grep -vxFf file1 file2
a1.txt
b2.txt
Run Code Online (Sandbox Code Playgroud)

2)在file1中打印不在file2中的所有内容,即file1 - file2

$ grep -vxFf file2 file1
c.txt
Run Code Online (Sandbox Code Playgroud)

(然后你可以用这些差异做你想做的事情,例如写入文件,排序等)

grep选项说明:

  -v, --invert-match        select non-matching lines
  -x, --line-regexp         force PATTERN to match only whole lines
  -F, --fixed-strings       PATTERN is a set of newline-separated strings
  -f, --file=FILE           obtain PATTERN from FILE
Run Code Online (Sandbox Code Playgroud)


No *_*lar 12

请执行下列操作:

cat file1 file2 | 排序| uniq -u

这将为您提供唯一(即不重复)的行列表.

说明:
1)cat file1 file2将所有条目放入一个列表中
2)sort将对组合列表进行排序
3)uniq -u将仅输出没有重复项的条目


ant*_*tak 8

这里使用的deft命令是简单的comm命令:

为了演示,让我们创建两个输入文件:

$ cat <<EOF >a
> a.txt
> b.txt
> c.txt
> EOF

$ cat <<EOF >b
> a.txt
> a1.txt
> b.txt
> b2.txt
> EOF
Run Code Online (Sandbox Code Playgroud)

现在,使用该comm命令来获得所需的问题:

$ comm -2 a b
        a.txt
        b.txt
c.txt
Run Code Online (Sandbox Code Playgroud)

这说明一个柱状输出失踪(系在文件a中而不是b在第一列)额外的文件(行b中而不是a在第二列).

到底是comm做什么的?

如果在没有任何开关的情况下键入命令,则输出如下:

$ comm a b
                a.txt
        a1.txt
                b.txt
        b2.txt
c.txt
Run Code Online (Sandbox Code Playgroud)

这显示了三列:

  1. a但不在的行b
  2. 在两条线ab
  3. b但不在的行a

编号开关的-123作用是隐藏输出中的指定列.

例如:

  • -13仅在公共行中指定结果
  • -12仅在行中指定结果b
  • -23仅在行中指定结果a
  • -2在对称差异中指定结果
  • -123在无输出中指定结果


Bea*_*ano 3

对于您引用@Sparr 的示例

a包含

a.txt
b.txt
c.txt
Run Code Online (Sandbox Code Playgroud)

b包含

a.txt
a1.txt
b.txt
b2.txt
Run Code Online (Sandbox Code Playgroud)

diff a b给出

1a2
> a1.txt
3c4
< c.txt
---
> b2.txt
Run Code Online (Sandbox Code Playgroud)

这个输出不符合您的需求是什么原因?