두 개의 파일이 있습니다. "파일 1"에는 직원 ID 번호가 포함되어 있고 "파일 2"에는 직원의 전체 데이터베이스가 포함되어 있습니다. 그들은 다음과 같습니다:
file1
123123 222333
file2
111222 Jones Sally 111333 Johnson Roger 123123 Doe John 444555 Richardson George 222333 Smith Jane 223456 Alexander Philip
file2
이 두 파일을 비교하고 ID 번호가 있는 항목을 제거하고 싶습니다 file1
.
이 명령이 완벽하게 작동한다는 것을 알았습니다 awk
.
awk 'FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3
결과:
file3
111222 Jones Sally 111333 Johnson Roger 444555 Richardson George 223456 Alexander Philip
그래서 이것은 예상대로 작동합니다.
내 질문은파일은 실제로 단순화된 .csv
파일이므로 공백 대신 쉼표를 구분 기호로 사용해야 합니다. 나는 이 작업을 수행하기 위해(즉, -F,
명령의 어느 곳에서나) 내가 생각할 수 있는 모든 것을 시도했지만 성공하지 못했습니다.-F','
-F","
.csv
파일에서 작동하게 하려면 어떻게 해야 합니까 ?
참고로 저는 MacBook Pro, OSX Lion을 사용하고 있습니다!
답변1
csv
귀하의 파일이 다음과 같다고 가정합니다 .
파일 1
123123,,
222333,,
파일 2
111222,Jones,Sally
111333,Johnson,Roger
123123,Doe,John
444555,Richardson,George
222333,Smith,Jane
223456,Alexander,Philip
join
다음과 같이 명령을 사용해 볼 수 있습니다 .
# join -t, -v 2 <(sort file1) <(sort file2)
111222,Jones,Sally
111333,Johnson,Roger
223456,Alexander,Philip
444555,Richardson,George
이 명령에 대한 자세한 내용은 여기에서 확인할 수 있습니다.남자들이 가입하다
join [OPTION]... FILE1 FILE2
-t CHAR
use CHAR as input and output field separator
-v FILENUM
like -a FILENUM, but suppress joined output lines
답변2
이 시도:
awk 'BEGIN{FS=","};FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3
답변3
다음 Python2 솔루션을 시도해 볼 수도 있습니다.
#!/usr/bin/env python2
import csv
with open('file_1') as f1:
file_1_list = [line[0] for line in csv.reader(f1)]
with open('file_2') as f2:
for line in csv.reader(f2):
if line[0] not in file_1_list:
print ' '.join(line)
답변4
추가하면 -F','
쉼표 구분 기호가 있거나 |
.-F'|'
이제 스크립트는 다음과 같아야 합니다.
awk -F',' 'FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3