"Ungrep"-일치하지 않는 패턴


13

다음을 수행하는 명령 또는 스크립트를 찾고 있습니다.

file1.txt :

abcd
efgh 
ijkl
mnop

file2.txt :

123abcd123
123efgh123
123mnop123

다음과 같은 명령을 원합니다.

ungrep file1.txt file2.txt

다음을 반환합니다.

ijkl

즉, file2.txt의 grep에서 결과를 반환하지 않는 file1.txt의 행을 제공합니다. file1.txt를 반복하고 각 줄에 대해 file2.txt를 grepping하고 결과를 저장하고 결과가 비어있는 줄을 출력 하여이 작업을 수행 할 수 있다는 것을 알고 있지만 더 효율적인 방법을 원했습니다.

답변:


18

GNU grep에서는 다음이 작동합니다. 이 -f옵션을 사용하여 file1.txt"패턴 파일"로 전달하십시오. 또한 두 번째로 데이터 파일로 전달하십시오. -o일치하는 부분 만보고하는 데 사용 합니다. 마지막으로 한 번만 일치하는 단어를 추출합니다. 일치하는 단어를 file1.txt찾지 못한 행에 해당합니다 file2.txt.

grep -h -o -f  file1.txt file2.txt file1.txt | sort | uniq -u
ijkl

아주 좋은 설명입니다. 감사합니다 +1.
unxnut

4
grep trickiness없이 동일한 효과를 얻을 수 있습니다. sort file1.txt <(grep -of file1.txt file2.txt) | uniq -u하지만 솔루션과 마찬가지로 패턴 파일에 실제로 정규식 메타 문자가 포함되어 있지 않은 경우에만 작동합니다.
rici

@rici, 그것은 아주 좋은 지적입니다
iruvar

2
개선 :grep -oFf file1.txt file2.txt | sort file1.txt - | uniq -u
스테판 Chazelas

10

당신은 다음과 awk같이 할 수 있습니다 :

awk '
  NR == FNR {w[$0]; next}
  {for (i in w) if (index($0,i)) delete w[i]}
  END {for (i in w) print i}' file1.txt file2.txt

를 사용하여 index정규 표현식과 일치하는 것이 아니라 하위 문자열을 찾습니다.

일치하는 단어를 찾으면 배열에서 단어를 삭제하므로 불필요한 검색을 피합니다.


1
나는 이것을 받아 들일 것입니다. O (n log n) 정렬을 호출하지 않으며 패턴에 정규식 메타 문자가 포함되어 있어도 이상하게 실패하지 않으며 정규식을 지원하도록 확장 될 수 있습니다.
Kaz

단순히 평가 w[$0]하는 것이 키를 배열에 추가하는 부작용이 있다고 믿을 수 없습니다 .
Kaz

1
@Kaz는, 그래 그 혼란 스러울 수 있습니다, 당신은 실수로 수행하여 의도적으로 배열 요소를 할당하지 많은 스크립트를 찾을 if (a[$1])대신에 if ($1 in a), 예를 들면. awk원본 awk과를 포함하여 모든 경우에 해당 nawk하지만 어제 표준을 보면 지정된 것을 찾을 수 없습니다.
Stéphane Chazelas 2016 년

1
@Kaz POSIX 인용문은 다음과 같습니다. "응용 프로그램은 in 연산자 와 함께 사용되는 다차원 인덱스를 괄호로 묶어야합니다. 특정 배열 요소의 존재를 테스트하는 in 연산자는 해당 요소가 존재하지 않아야합니다. 존재하지 않는 배열 요소에 대한 다른 참조는 자동으로 생성합니다. " 그것은 단락 또는 두 위로 스크롤하여 찾을 수 있습니다 여기를 .
jw013

1
긴만큼 file1큰되지 않습니다 (큰 일부 값), 나는 그것이 어떤의 정렬이 없이도 할 수있는 솔루션을 선호하는 것 file2훨씬 더 효율적이 될 것으로 예상된다합니다.
jw013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.