sed를 사용하여 다른 파일의 한 파일에서 동일한 줄을 삭제하는 방법은 무엇입니까?

sed를 사용하여 다른 파일의 한 파일에서 동일한 줄을 삭제하는 방법은 무엇입니까?

두 개의 파일이 있는데 하나는 다른 하나의 상위 집합입니다. 더 큰 파일에서 더 작은 파일의 동일한 줄을 삭제하고 싶습니다.

한 가지 가능한 문제는 해당 줄에 백슬래시가 포함되어 있다는 것입니다.

어떻게 해야 하나요?

답변1

이것은 내 조각입니다.

remove_lines()
{
    # remove lines from a file 
    #  
    # $1 - source file with patterns of lines to be removed
    # $2 - destination file
    tmpfile=$(mktemp "$(dirname -- "$2")"/XXXXXXXX) &&
    grep -F -f "$1" -v -- "$2" >>"$tmpfile" &&
    mv -- "$tmpfile" "$2" &&
}

편집: 방금 그것이 거기에 없다는 것을 깨달았습니다 sed. 하지만 그건 별로 중요하지 않습니다. 그렇죠?

답변2

@rajish의 답변 grep은 가깝지만 뭔가 빠졌습니다. 동일한 콘텐츠 삭제에 대한 질문철사. 기본적으로 grep일치합니다 .(라인의 일부).

POSIX grep적합한 옵션이 있습니다.

-x
종결자를 제외하고 줄의 모든 문자를 사용하는 입력 줄만 고려됩니다.새로운 팀전체 고정 문자열 또는 정규식을 일치하는 행으로 일치시킵니다.

이를 고려하면 grep다음과 같이 할 수 있습니다.

cp -f -p input.txt input.txt~
grep -v -x -F -f input.pat input.txt~ >input.txt

어디Enter.pat삭제할 행이 포함되어 있으며입력.txt업데이트할 파일입니다.

@nvarun의 솔루션사용 sed패턴 파일에서 문자를 이스케이프 처리하지 않는다는 점 /을 제외하면 비슷한 문제가 있습니다 . 이 예제는 나에게 효과적이며 구문을 다음으로 제한합니다.POSIX sed:

cp -f -p input.txt input.txt~
sed -e 's/\([\/]\)/\\\1/g' -e 's/^/\/^/' -e 's/$/$\/d/' input.pat > input.sed
sed -f input.sed input.txt~ >input.txt

깔끔함을 위해 둘 다 업데이트하기 전에 원본 파일을 저장합니다(POSIX CP).

Enter.pat

first
this is second
second/third
second\third

입력.txt

first
only first should match
this is not first
this is second
the previous line said this is second
first/second/third
second/third
first\second\third
second\third

결과:

only first should match
this is not first
the previous line said this is second
first/second/third
first\second\third

답변3

다음 스크립트를 시도해 보세요.

## $1 - Small File
## $2 - Large File

sed 's/^/\//; s/$/\/d/; s/\\/\\\\/g' $1 > $HOME/sed_scpt.txt
sed 's/\\/\\\\/g' $2 | sed -f $HOME/sed_scpt.txt > $HOME/desired_output.txt

## Alternatively, you could change the 2nd line with the following;
sed -f $HOME/sed_scpt.txt $2 > $HOME/desired_output.txt

참고: 저는 GNU sed 4.2.1을 사용했습니다.

관련 정보