입력 파일에서 주어진 라인을 포함하는 (여러) 파일에서 라인 찾기

입력 파일에서 주어진 라인을 포함하는 (여러) 파일에서 라인 찾기

다음과 같은 파일이 많은 경우:

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.file2file1file2

그리고 모든 것이 다시 합쳐집니다 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에서 반환된 패턴을 검색합니다.

관련 정보