행이 많은 csv 파일이 있는데 일치하는 항목을 찾아 파일로 출력해야 합니다. 내 데이터는 다음과 같습니다
파일 1
qwerty
asdfgh
zxcvbn
qwerty
aassdd
zzxxcc
yyuuii
tttttt
다음과 일치해야 합니다.
파일 2
qwert
tttttt
aassdd.
내 파일이 크고 일치 항목 목록이 길기 때문에 다음을 수행합니다.
while read n ; do grep $n File_1.csv >> results.csv ; done < File_2.csv
내가 원하는 결과를 얻을 수 없습니다.
답변1
반복할 필요는 없습니다. 이 -f
옵션은 검색할 패턴이 포함된 파일을 사용합니다.
grep -Ff File_2.csv File_1.csv > results.csv
-F
검색어가 정규 표현식이 아닌 문자 그대로 처리되도록 옵션 도 추가했습니다 .
답변2
각 파일에 중복 항목이 없으면 다음을 수행할 수 있습니다.
# In file_1 and file_2
sort file_1 file_2 | uniq -d
# In file_1 or file_2 but not both
sort file_1 file_2 | uniq -u
# In file_1 and not file_2
sort file_1 file_2 | uniq -d | sort - file_1 | uniq -u
# In file_2 and not file_1
sort file_1 file_2 | uniq -d | sort - file_2 | uniq -u
답변3
이 grep
유틸리티는 한 파일에서 패턴을 읽고 이를 다른 파일의 내용과 일치시킬 수 있습니다. 쉘에서 반복할 필요가 없습니다.
$ grep -f patterns file
질문에 있는 두 파일(파일 1은 file
파일 2는 patterns
)을 사용하면 다음이 생성됩니다.
qwerty
qwerty
tttttt
patterns
고정 문자열(정규 표현식 아님)의 패턴을 일치시키려면 다음을 추가하세요 -F
.
$ grep -F -f patterns file
주어진 예에서 이는 사용하지 않는 것과 동일한 결과를 생성합니다 -F
.
전체 줄을 강제로 일치시키려면 다음을 추가하세요 -x
.
$ grep -x -F -f patterns file
tttttt
qwerty
이러한 행은 정확히 일치하지 않기 때문에 반환되지 않습니다 qwert
.