sed 또는 grep 및 기타 vfF와 동등한 것

sed 또는 grep 및 기타 vfF와 동등한 것

RHEL6.10, gnu grep 2.2

grep -vfF stem.txt source.txt > filteredoutput.txt

stem.txt숫자는 13개뿐입니다.

source.txt위치 225에서 시작하는 13비트 필드 값을 갖는 고정 길이(400) 데이터 파일입니다. 필드 값은 파일 내에서 고유합니다. 두 경우 모두 개행 문자는 줄 구분 기호입니다.

source.txtstem.txt행 수는 약 80,000개, 약 4,500개 입니다.

그러나 내 출력 파일에는 약 75,000줄이 있는데, 이는 줄기 파일에 있는 것보다 더 많은 콘텐츠를 필터링하고 있음을 의미합니다.

왜 이런 일이 발생하는지 이해하지 못합니다.

source.txt문제를 해결하는 동안 숫자 필드를 제외한 각 줄의 다른 모든 항목을 공백으로 바꾼 다음 올바른 결과를 얻었습니다. 매우 혼란스러운 행동.

  1. 어떻게 해결할 수 있는지 모르시나요?
  2. 다른 옵션은 무엇입니까? 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.txtF

아마도 다음과 같은 의미일 것입니다.

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.

관련 정보