문맥 문구가 포함되지 않은 줄을 파일에서 검색합니다.

문맥 문구가 포함되지 않은 줄을 파일에서 검색합니다.

키워드와 여러 줄의 숫자가 포함된 항목이 많은 파일이 있습니다. 특정 유형의 항목을 필터링하고 싶기 때문에 항목 derp 뒤에 세 줄이 오면 grep -v -A3 derp filename파일 이름에서 derp 유형이 아닌 모든 항목을 가져오고 싶습니다. 문제는 비호환성인 것 같습니다 -v. -A두 플래그를 모두 사용하면 -v무시됩니다. 내가 또 무엇을 할 수 있나요? 파일은 다음과 같습니다.

SOURCE: pI < min 45 16 0 7.4871483836177132E-004 5.1628324610858206E-004 -1.826383220714803 -9.4293105782888549E-004 -6.8875048798939895E-002 -0.2196057448134437 -6.6270591049115615E-003 SOURCE: pI < min 45 17 0 7.1266687952112871E-004 5.1628324610858206E-004 -2.169039713847648 -1.1198388644036935E-003 -8.2240618017566103E-002 -9.0412967200093102E-005 -7.5453919169102962E-003 SOURCE: pI < min 45 18 0 7.0936181176839061E-004 5.1628324610858206E-004 -2.589392543137075 -1.3368599876201657E-003 -9.8187643312659903E-002 -1.1762198384731523E-005 -9.4417591779528513E-003

이는 수천 줄에 걸쳐 비슷한 방식으로 계속됩니다. 때때로 항목이 가 아닌 다른 것으로 시작되는 경우가 있습니다 SOURCE: pI < min. 제가 찾고 싶은 것은 바로 이 항목들입니다. 파일 크기는 약 50Mb입니다.

답변1

유용한 것을 찾았습니다.

grep -A3 derp filename | diff - filename

답변2

다른 방향에서 해보는 건 어떨까요?

sed '/pattern/,+3d' input_file

또는 없는 경우 gnu sed:

sed '/pattern/ {N;N;N;d;} input_file

패턴을 포함하는 줄과 해당 줄 다음의 3줄을 제외한 모든 텍스트가 표시됩니다.

또는 파일을 그 자리에서 편집하려면 다음을 수행하세요.

sed -i '/pattern/,+3d' input_file

-i귀하의 제품이 지원하지 않는 경우 sed:

sed '/pattern/ {N;N;N;d;} inputfile > output_file
mv output_file input_file

기본적으로 원하는 작업을 수행해야 합니다. 즉, 파일을 포함해야 합니다.

cat
dog
dog
dog
horse

이것이 내 패턴이라면 horse결과는 하나만 얻을 것입니다.cat

답변3

필요하지 않은 다른 항목이 모두 숫자가 아니라고 가정하면 를 사용하여 해당 항목의 목록을 작성할 수 있습니다 grep -v '^([0-9-]+|SOURCE:)' filename. 이렇게 하면 일치하는 줄 전체가 출력되므로 추가 처리가 필요합니다.

모두 단어 뒤에 콜론이 오는 패턴을 따르는 경우 를 사용할 수 있습니다 awk -F: '!/^([0-9]+|SOURCE:)/ { print $1}'.

목록이 있으면 이를 사용하여 모든 항목과 일치하는 정규식을 작성한 다음 sed일치하는 항목 중 하나가 발견될 때마다 4개의 행을 삭제하는 데 사용할 수 있습니다.

예를 들어:

LIST=$(awk -F: '!/^([0-9-]+|SOURCE:)/ { print $1}' filename | sort -u)
RE=$(echo $LIST | sed -e 's/ /|/g')

sed -r -e "s/^($RE):/,4 d" filename

일부 항목을 제거하는 등 정규식을 작성하기 전에 목록에 대한 추가 처리가 필요한 경우 다음을 수행할 수 있습니다.

RE=$(echo "$LIST" | egrep -v '^(FOO|BAR)$' | xargs echo | sed -e 's/ /|/g')

이번에는 "$LIST" 주위에 큰따옴표가 있음에 유의하세요. 이는 egrep에서 사용하는 줄 바꿈을 유지합니다(이것이 xargs echo한 줄의 모든 목록 항목을 가져오기 위해 나중에 파이프 해야 하는 이유입니다 sed).

관련 정보