두 개의 목록이 있는데 list1에서 list2를 제외하고 싶습니다.

두 개의 목록이 있는데 list1에서 list2를 제외하고 싶습니다.

목록 1:

1,name1                   
2,name2                    
3,name3                  
4,name4                   
5,name5                  
6,name6                  
7,name7                  
8,name8                  
9,name9                  

목록 2:

3
13
14
6
1
7
15
26

다음과 같은 출력이 필요합니다.

2,name
4,name
5,name
8,name
9,name

출력에는 열 1의 항목이 포함되어야 합니다.목록 1어떤 것들은 없나요?목록 2.

목록 1그리고목록 2정렬되지는 않았지만 필요한 경우 두 목록을 모두 정렬합니다.
목록 1약 60,000개의 레코드가 있고 List2에는 20,0000개가 포함되어 있습니다. Linux 쉘 또는 mysql.

답변1

다음을 사용한다고 가정합니다 bash(그렇지 않으면 및를 사용하여 입력 파일을 미리 정렬 sort -o List1 List1하고 절차적 대체 대신 sort -o List2 List2사용 ).List1 List2

$ join -t, -v1 <( sort List1 ) <( sort List2 )
2,name2
4,name4
5,name5
8,name8
9,name9

이는 두 파일 간의 관계형 JOIN 작업을 수행하고 먼저 해당 내용을 정렬합니다. 쉼표를 필드 구분 기호로 처리하도록 지시하며 -t,첫 번째 파일의 항목이 두 번째 파일의 항목과 연결되지 않도록 요구합니다. 기본적으로 연결은 각 파일의 첫 번째 필드에서 발생합니다.join-v1

마지막 정수를 제거하려면 다음을 수행하십시오.

join -t, -v1 <( sort List1 ) <( sort List2 ) | sed 's/[0-9]*$//'

MySQL 솔루션의 경우 관련 테이블에 대한 SQL 스키마를 제공해야 하지만 결과 쿼리는 다음과 같습니다.

SELECT * FROM table1 WHERE joinfield1 NOT IN (SELECT joinfield2 FROM table2);

답변2

사용 grep:

grep -wvf List2 List1

산출:

2,name2
4,name4
5,name5
8,name8
9,name9

답변3

이 시도,

awk -F ',' 'NR==FNR{a[$1]++;next};a[$1] == 0'  List2  List1

2,name2                    
4,name4                   
5,name5                  
8,name8                  
9,name9
  • a[$1]++; next: 배열의 첫 번째 필드를 저장합니다. 그 다음에,
  • a[$1] == 0: else 블록은 이것이 두 번째 파일인 경우에만 실행되므로 해당 파일의 필드 1이 표시되었는지 확인합니다( a[$1]==0).

관련 정보