我有两个文件列表,我想要差异.第二个列表中包含更多文件,因为当我对这两个列表进行区分时,它们都按字母顺序排列,我得到的文件(行)存在于两个列表中,但位于不同的位置.
我想区分这两个列表,忽略列表中的行位置.这样我只会获得列表中的新行或缺失行.
谢谢.
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将仅输出没有重复项的条目
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)
这显示了三列:
a但不在的行ba和bb但不在的行a编号开关的-123作用是隐藏输出中的指定列.
例如:
-13仅在公共行中指定结果-12仅在行中指定结果b-23仅在行中指定结果a-2在对称差异中指定结果-123在无输出中指定结果对于您引用@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)
这个输出不符合您的需求是什么原因?