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

관련 정보