파일 [중복]에서 공통 줄 제거

파일 [중복]에서 공통 줄 제거

파일이 두 개 있어요파일 A&문서 B

fileA에는 많은 IP가 있고 fileB에는 더 적은 IP가 있습니다. 우리는 무엇을 해야 합니까?

fileA - fileB = fileC(공용 IP가 없는 파일)

파일 A

1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
5.5.5.5

문서 B

4.4.4.4
1.1.1.1

파일C

2.2.2.2
3.3.3.3
5.5.5.5

Google에 많은 옵션이 있지만 관련된 항목을 찾을 수 없습니다.

답변1

comm도구는 특히 영숫자순으로 정렬되는 결과에 관심이 없는 경우 유용할 수 있습니다.

comm -23 <( sort -u fileA ) <( sort -u fileB ) >fileC

사용에 대한 자세한 내용은 man sort및 을 참조하십시오.man comm

답변2

이를 위해 fileA - fileBawk를 사용할 수 있습니다(이렇게 하면 에서만 IP를 얻을 수는 없습니다 fileB).

awk 'NR==FNR{a[$0];next}!($0 in a)' fileB fileA

NR총 레코드 수를 나타내며, FNR현재 파일의 레코드 번호(보통 줄 번호)를 나타냅니다. 따라서 첫 번째 파일에 줄이 있으면 두 번째 파일에는 나타나지 않습니다.


fileA에서 중복 행을 제거해야 하는 경우 다음을 사용합니다.

awk 'NR==FNR{a[$0]++;next}!a[$0]++' fileB fileA

답변3

이 질문은 여러 가지 다른 방식으로 설명될 수 있습니다.

각 줄은 해당 파일 내에서 고유하다고 가정합니다.

  • fileA에도 있는 항목을 삭제한다고 가정해 보겠습니다 fileB.

    fileB이렇게 하면 다음에서 발견된 IP 주소가 제거됩니다 fileA.

    grep -v -Fx -f fileB fileA >fileC
    

    여기에 사용된 옵션은 grep패턴( fileBusing 에서 읽은 행 -f)이 정규식( -F)이 아닌 문자열로 처리되고 하위 문자열( )이 아닌 전체 행과 일치하는지 확인합니다 -x. 또한 일치의 의미를 바꾸어 의 어떤 행과도 일치하지 않는 모든 행을 -v출력합니다 .fileAfileB

  • 고유한 모든 항목을 얻고 싶다고 가정해 보겠습니다.fileA 또는고유한 기능은 다음과 같습니다 fileB.

    다음 출력 파일에 중복되지 않은 줄이 있습니다. 비표준이지만 후속 라인에서 반복되지 않는 라인을 출력하기 위해 일반적으로 사용되는 옵션인 -uwith 를 사용합니다 .uniq

    sort fileA fileB | uniq -u >fileC
    

답변4

순서를 유지하는 것이 중요하지 않은 경우 먼저 첫 번째 파일에서 중복 항목을 제거한 다음 출력을 두 번째 파일과 두 번 연결(고유한 항목을 제거하기 위해)한 다음 uniq -u.

sort -u fileA | cat - fileB fileB | sort | uniq -u

관련 정보