두 개의 파일이 있는데 하나는 다른 하나의 상위 집합입니다. 더 큰 파일에서 더 작은 파일의 동일한 줄을 삭제하고 싶습니다.
한 가지 가능한 문제는 해당 줄에 백슬래시가 포함되어 있다는 것입니다.
어떻게 해야 하나요?
답변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을 사용했습니다.