Linux에서 이 출력 파일을 얻는 더 빠른 방법이 있습니까?

Linux에서 이 출력 파일을 얻는 더 빠른 방법이 있습니까?
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 1with를 사용하여 grep첫 번째 일치 후 중지할 수 있습니다 file1.

while IFS= read -r i; do grep -Fm1 "$i" file1; done <file2
  • -F패턴을 문자 그대로 처리합니다.
  • -m 1grep첫 경기 후 퇴장하게 만든다

쉘 루프는 일반적으로 효율적이지 않지만 패턴 목록이 작기 때문에 이 경우에 사용할 수 있습니다.

더 빠른 대안, 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. 그렇다면 해당 행을 인쇄하고 키를 삭제합니다.

관련 정보