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