목록 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
).