줄이 많은 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
행은 반환되지 않습니다.