두 개의 숫자 목록을 정렬하고 uniq를 사용하여 교차점을 얻으십시오.

두 개의 숫자 목록을 정렬하고 uniq를 사용하여 교차점을 얻으십시오.

파일 A와 B가 있으므로 다음 명령을 사용했습니다.

(sort -n A B) | uniq -d

그러면 두 파일 모두에 나타나는 숫자가 제공됩니다.

1
2
2
3
4
5
11
11
12
31

이것은 내가 얻은 숫자이지만 sort -n A B파이프하면 uniq -d2가 아닌 11만 얻습니다. 내가 뭘 잘못했나요?

답변1

많이 사용하지 않아서 그냥 언급하겠습니다.다음을 기반으로 한 솔루션:

comm -12 <(sort A) <(sort B)

이는 <( ... )프로세스 대체를 사용하여 파일 A와 B를 정렬하고 이를 입력으로 공급한 comm후 다음을 사용합니다 -12.

  -1     suppress column 1 (lines unique to FILE1) 
  -2     suppress column 2 (lines unique to FILE2)

...두 파일에 공통된 줄만 남겨 둡니다.

답변2

의견에서 알 수 있듯이 문제는 공백이나 캐리지 리턴일 수 있는 것 같습니다. 다음 방법 중 하나로 문제를 해결할 수 있습니다.

$ (sort -n A B) | sed -E 's/[^[:alnum:]]+$//' | uniq -d
$ (sort -n A B) | tr -d '\r ' | uniq -d

GNU sed의 일부 버전에서는 -r확장 정규식을 사용하여 정보를 얻습니다. tr확실히 더 간단하지만, 뒤따르는 문자가 있든 없든 문자를 제거하기 때문에 더욱 잔인합니다.

답변3

후행 공백에 대해 don_crissti가 언급한 것 외에도 파일 유형/개행 스타일을 확인하는 것이 좋습니다. uniq 매뉴얼 페이지에는 다음과 같이 명시되어 있습니다.

uniq - report or omit repeated lines

CRLF가 예상되는 LF 대신 Windows 스타일 줄바꿈을 의미한다고 말하면 놀랄 수도 있습니다.

다음을 사용하여 유형을 빠르게 확인할 수 있습니다.

file <filename>

CRLF 끝 줄 시퀀스를 제거하려면 dos2unix를 통해 입력 파일을 실행할 수 있습니다. 다음은 줄 끝 문자를 변환합니다.

dos2unix A
dos2unix B

답변4

파일 크기에 따라 다음을 사용할 수 있습니다 grep.

grep -Fxf A B

-f패턴 목록을 가져올 파일을 지정합니다.

-x전체 줄만 일치함을 나타냅니다(줄의 부분 일치는 허용되지 않음).

-F이는 패턴이 정규 표현식이 아닌 고정 문자열로 처리된다는 의미입니다.

크기가 작을 경우 B패턴 파일 이름을 ( ) 로 지정하면 A약간 더 빠른 결과를 얻을 수 있습니다.Bgrep -Fxf B A

출력을 파이프하여 sort -u각 파일에 나타나는 다양한 줄의 정렬된 목록을 얻을 수 있습니다.

grep -Fxf A B | sort -u

물론 문제가 캐리지 리턴 줄 끝인 경우 dos2unix이를 먼저 사용해야 합니다.

관련 정보