RHEL6.10, gnu grep 2.2
grep -vfF stem.txt source.txt > filteredoutput.txt
stem.txt
숫자는 13개뿐입니다.
source.txt
위치 225에서 시작하는 13비트 필드 값을 갖는 고정 길이(400) 데이터 파일입니다. 필드 값은 파일 내에서 고유합니다. 두 경우 모두 개행 문자는 줄 구분 기호입니다.
source.txt
stem.txt
행 수는 약 80,000개, 약 4,500개 입니다.
그러나 내 출력 파일에는 약 75,000줄이 있는데, 이는 줄기 파일에 있는 것보다 더 많은 콘텐츠를 필터링하고 있음을 의미합니다.
왜 이런 일이 발생하는지 이해하지 못합니다.
source.txt
문제를 해결하는 동안 숫자 필드를 제외한 각 줄의 다른 모든 항목을 공백으로 바꾼 다음 올바른 결과를 얻었습니다. 매우 혼란스러운 행동.
- 어떻게 해결할 수 있는지 모르시나요?
- 다른 옵션은 무엇입니까? sed /awk와 동일합니다.
편집 : 만세 grep! 문제는 사용자/나에게 있습니다. 실수로 나는 소스 파일의 다른 곳에 나타날 수 있는 특별한 13비트 시퀀스의 가능성을 고려하지 않았습니다. grep 명령과 해당 매개변수는 예상대로 작동합니다.
답변1
를 사용하여 awk
이러한 문자열이 있어야 할 곳에서만 찾을 수 있는지 확인하세요.
awk '!source {stem[$0]; next}
! (substr($0, 225, 13) in stem)
' stem.txt source=1 source.txt > filteredoutput.txt
( substr()
시작 위치는 1부터 시작됩니다.)
source.txt
또한 4,500개의 하위 문자열 조회 대신 행당 하나의 해시 조회만 수행하면 되므로 더욱 효율적입니다 .
알아채다
grep -vfF stem.txt source.txt
예
grep -v -f F stem.txt source.txt
(정규 표현식과 일치하지 않는 파일의 행을 찾으십시오 stem.txt
).source.txt
F
아마도 다음과 같은 의미일 것입니다.
grep -vFf stem.txt source.txt
( source.txt
문자열이 포함되지 않은 행을 찾습니다 stem.txt
).
답변2
또 다른 방법은 다음 ERE sed
에 대해 225번째 위치부터 일치하는 ERE를 동적으로 생성하는 것입니다 .grep
grep -vEf <(sed 's/.*/^.{224}&/' stem.txt) source.txt
따라서 임의의 위치에서 다른 가능한 일치가 출력에 영향을 미치지 않도록 특정 위치에서 일치를 시작해야 합니다.
grep
-v
없이 실행하고 결과를 비교하여 다른 위치에서 일치하는 항목을 테스트 할 수도 있습니다 stem.txt
.