
我有 2 個文件,我想找出差異並只輸出 ex2 中沒有的內容
如果使用grep -Ff ex2.txt ex1.txt
,它會向我顯示 a b c d
,如果我使用相同的命令,則-v
沒有輸出。為什麼第一個指令也輸出d
?
做到這一點最簡單的方法是什麼? grep 適合這個嗎?也許 diff 可能是可以讀取每一行並輸出(如果存在或不存在)的腳本?
cat ex1.txt
a
b
c
d
cat ex2.txt
a
b
c
編輯---我的輸出顯示如下:
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -vf ex2.txt ex1.txt
grep -f ex2.txt ex1.txt
a
b
c
d
答案1
grep
並不是真正適合這裡工作的工具,但快速瀏覽一下grep manpage
應該會有所幫助(請注意,不同grep
發行版之間的差異很大,因為有些發行版可能默認使用GNU,而其他發行版可能會使用其他工具)。
- -F ...固定字串(以換行符號分隔)-(類別:匹配器選擇)
- -f ... 檔案名稱(類別:符合控制項)
- -v ...反轉匹配(類別:匹配控制)
所以,你可能會想像類似的東西grep -Fvf ex2.txt ex1.txt
會起作用。然而,這不是一個好的解決方案,因為它要求您在開始之前已經了解有關文件的一些資訊。有更好的工具(例如 的變體diff
)可以為您提供文件和/或目錄之間更具體和更準確的差異。
編輯:固定字串,而不是 Fire 字串(該死的自動損壞)
答案2
嘗試更改文件的順序:
grep -v -f ex2.txt ex1.txt
> d
答案3
無法重現您的錯誤:
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -vf ex2.txt ex1.txt
d
grep -f ex2.txt ex1.txt
a
b
c
grep -Ff ex2.txt ex1.txt
a
b
c
grep -vFf ex2.txt ex1.txt
d
grep -V
grep (GNU grep) 2.20
lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.5 (jessie)
Release: 8.5
Codename: jessie
編輯(在 OS X 上使用 BSD grep):
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -f ex2.txt ex1.txt
a
b
c
grep -vf ex2.txt ex1.txt
d
grep -Ff ex2.txt ex1.txt
a
b
c
grep -v -Ff ex2.txt ex1.txt
d
grep -V
grep (BSD grep) 2.5.1-FreeBSD