파일 A와 B가 있으므로 다음 명령을 사용했습니다.
(sort -n A B) | uniq -d
그러면 두 파일 모두에 나타나는 숫자가 제공됩니다.
1
2
2
3
4
5
11
11
12
31
이것은 내가 얻은 숫자이지만 sort -n A B
파이프하면 uniq -d
2가 아닌 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
약간 더 빠른 결과를 얻을 수 있습니다.B
grep -Fxf B A
출력을 파이프하여 sort -u
각 파일에 나타나는 다양한 줄의 정렬된 목록을 얻을 수 있습니다.
grep -Fxf A B | sort -u
물론 문제가 캐리지 리턴 줄 끝인 경우 dos2unix
이를 먼저 사용해야 합니다.