파일이 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