cat file_1
my colour is red
my rose is red
my colour is blue
my rose id blue
cat file_2
red
blue
cat output_file should be
my colour is red
my colour is blue
여기 내가 사용하고 있어요
cat file_2 | while read line;do cat file_1 | grep "$line" | head -1;done
pattern "red" and "blue"
여기 나는file_2
as fast as possible
루프에 시간이 걸리는 동안 , 을 수행할 수 있는 다른 방법이 있습니까?
답변1
구문 을 사용 while
하여 패턴을 반복한 file2
다음 -m 1
with를 사용하여 grep
첫 번째 일치 후 중지할 수 있습니다 file1
.
while IFS= read -r i; do grep -Fm1 "$i" file1; done <file2
-F
패턴을 문자 그대로 처리합니다.-m 1
grep
첫 경기 후 퇴장하게 만든다
쉘 루프는 일반적으로 효율적이지 않지만 패턴 목록이 작기 때문에 이 경우에 사용할 수 있습니다.
더 빠른 대안, xargs
:
xargs -a file2 -n1 -P2 -I'{}' grep -Fm1 {} file1
더 많은 패턴을 보려면 더 많은 병렬 프로세스( -P
)를 사용하세요.
예:
% while IFS= read -r i; do grep -Fm1 "$i" file1; done <file2
my colour is red
my colour is blue
% xargs -a file2 -n1 -P2 -I'{}' grep -Fm1 {} file1
my colour is blue
my colour is red
답변2
file_2의 줄과 일치하는 file_1의 첫 번째 줄을 인쇄하려면 다음을 수행하세요.
$ awk 'FNR==NR{a[$0];next} {for (line in a) if ($0~line) {print; delete a[line]}}' file_2 file_1
my colour is red
my colour is blue
이 접근 방식은 각 파일을 한 번만 읽습니다.
작동 원리
FNR==NR{a[$0];next}
이는 file_2의 모든 행을 연관 배열의 키로 저장합니다
a
.for (line in a) if ($0~line) {print; delete a[line]}
file_1의 모든 행에 대해 array의 키와 일치하는지 확인합니다
a
. 그렇다면 해당 행을 인쇄하고 키를 삭제합니다.