다른 파일에 포함된 한 파일의 줄을 삭제하는 방법은 무엇입니까?

다른 파일에 포함된 한 파일의 줄을 삭제하는 방법은 무엇입니까?

전체 목록과 부분 목록이라는 두 개의 목록이 있습니다. 섹션의 모든 행에 대한 전체 목록을 검색하고 있는 경우 전체 목록에서 제거되는 bash 스크립트를 원합니다. 누구든지 도와줄 수 있나요?

답변1

grep파일에서 한 줄에 하나씩 여러 패턴을 읽을 수 있습니다. 일치하지 않는 줄을 출력하고 정규식 대신 문자열을 일치시키며 전체 줄이 일치하도록 요구하는 -v옵션 과 함께 사용됩니다.-F-x

grep -Fvx -f partial.list complete.list >remaining.list &&
mv remaining.list complete.list

분명히 두 번째 명령줄은 전체 목록이 포함된 파일을 덮어쓰는 경우에만 작동합니다.

부분 목록이 크고 목록을 다시 정렬해도 괜찮다면join아마도 더 빠를 것입니다.

답변2

당신은 또한 사용할 수 있습니다 -

comm -23 file1 file2

명령이 제대로 작동하려면 파일을 정렬해야 합니다. 명령 출력에서 ​​file2의 항목은 file1에서 제거됩니다.

답변3

두 목록에 중복된 요소가 없으면 다음이 작동합니다.

join -t$'\n' -v1 <(sort complete) <(sort partial)

목록에 중복된 요소가 포함될 수 있고 중복된 요소를 무시하려는 경우 -usort 하위 명령에 이 플래그를 사용하면 고유한 요소만 출력됩니다.

관련 정보