grep을 사용하여 루프를 읽는 동안

grep을 사용하여 루프를 읽는 동안

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

관련 정보