![입력 파일에서 주어진 라인을 포함하는 (여러) 파일에서 라인 찾기](https://linux55.com/image/71266/%EC%9E%85%EB%A0%A5%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EC%A3%BC%EC%96%B4%EC%A7%84%20%EB%9D%BC%EC%9D%B8%EC%9D%84%20%ED%8F%AC%ED%95%A8%ED%95%98%EB%8A%94%20(%EC%97%AC%EB%9F%AC)%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EB%9D%BC%EC%9D%B8%20%EC%B0%BE%EA%B8%B0.png)
다음과 같은 파일이 많은 경우:
file1
:
123
456
789
012
file2
:
line1 922
line2 392
line3 456
line5 291
line6 201
...
file3
:
line1 111
line2 123
line3 19
line5 542
line6 456
...
file1
한 행에 포함된 모든 행을 가져오는 가장 좋은 방법은 무엇입니까?둘 다 file2
그리고 file3
?
이 예에서는 다음과 같습니다.
456
답변1
grep -of file1 file2|xargs -I {} grep -o "{}" file3
먼저 file1의 입력을 받아 file2에 한 줄씩 입력하여 정확히 일치하는 텍스트(있는 경우)를 반환합니다. 그런 다음 결과가 있으면 다시 file3에 한 줄씩 공급되어 일치하는 텍스트만 반환합니다.
답변2
join
연속해서 2번 사용할 수 있습니다 :
join -1 1 -2 2 -o 1.1 <(join -1 1 -2 2 <(sort file1) <(sort -k2 file2)) <(sort -k2 file3)
인쇄 전용:
465
먼저 내부를 살펴보세요 join
. 의 필드 1과 의 필드 2를 사용하여 합계를 연결합니다 file1
.file2
file1
file2
그리고 모든 것이 다시 합쳐집니다 file3
. 파일은 sort -k
조인 필드( )를 기준으로 정렬되어야 합니다.
답변3
also(){
sed 'h; #save a copy of the line before edits
s/[]$\./*^[]/\\&/g; #literally quote any metachars
s|.*|/&/c\\|p; #print first half of sed command
g; #get original copy out of hold space
s/\\/&&/g;' | #double-up backslashes
sed -nf - -- "$@" #read stdin script -file
}
이 함수는 패턴 파일을 표준 입력으로 사용하고 하나 이상의 검색 파일을 인수로 사용합니다. 검색 파일과 일치하는 패턴 파일의 모든 행을 출력에 기록합니다. 매번 원본을 정확하게 재현하기 위해 세심한 주의를 기울입니다. 그렇기 때문에 재귀적으로 사용할 수 있습니다.
also <file1 file2 | also file3
456
답변4
grep은 솔루션에 충분할 것입니다
grep -o "`grep -of file1 file2`" file3
내부적으로 grep " grep -f file1 file2
"은 file1과 file2에 있는 패턴을 grep하고 file3에서 반환된 패턴을 검색합니다.