bash의 다른 파일에서 항목 목록 제거


0

한 파일에 나열된 항목을 다른 파일에서 제거하는 가장 효율적인 방법 (반복 된 명령 실행 없음)은 무엇입니까?

두 번째 파일에서 일치하지 않는 항목 목록을 쉽게 얻을 수 있습니다.

cat first_file.txt second_file.txt | sort | uniq -u

그러나 첫 번째 파일의 일치하지 않는 모든 항목도 포함됩니다 ... 이제 무엇?

답변:


1

awk프로그램은 각 파일을 한 번 통과합니다.

awk '
    NR == FNR {f1[$0] = 1; next}
    !($0 in f1)
' file1 file2

comm 이 작업에 유용합니다. 입력 파일을 정렬해야합니다.

# output lines unique to file2
comm -13 <(sort file1) <(sort file2)

나는 어떻게 아무 생각이 없다 !($0 in f1)내부적으로 작동, 내 말 내부 AWK를 . 그것이 모든 배열을 간단하게 스캔한다면, O (n!)이 있어야합니다. :-| 정렬고도로 최적화 된 것 같습니다 ... 관련 정보가 있습니까?
Hastur

in오퍼레이터 테스트 왼쪽 피연산자는 (결합 또는 인덱스) 배열의 인덱스 인 경우. O (1) 연산이어야합니다. 둔한를 들어, 여기에 설명 : gnu.org/software/gawk/manual/html_node/...
글렌 잭맨

참조 주셔서 감사합니다. 여기서 O (n ^ 2) [BTW 정오표 O (n ^ 2)가 아닌 O (n!)가 아님] in에서 전체 배열을 f1하나의 요소 만 스캔해야합니다 . 나는 32 바이트의 10 ^ 4 ~ 10 ^ 6 개의 임의 문자열을 테스트하고 awk솔루션 스케일을 선형으로 확장했습니다. ( comm솔루션은 10 ^ 4에서 2x, 10 ^ 5에서 ~ 1x 및 2x 10 ^ 6에서 더 다양하지만 사용 가능한 메모리에 따라 다릅니다.)
Hastur

쿨, 나는 몰랐다 comm.
dronus

동일한 작업을 다음과 grep같이 수행 할 수 있습니다 .grep -v -f <(command1) <(command2)
Andy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.