패턴 라인과 일치하는 라인을 표시하는 Grep

패턴 라인과 일치하는 라인을 표시하는 Grep

다음 두 파일이 있다고 가정해 보겠습니다.

1.

Locus_1 univ
Locus_2 anc
Locus_3 cat

2.

university  GO:000001
impromptu   GO:000002
advanced    GO:000003
inheritance GO:000004

파일 #2에 있는 파일 #1의 $2에 대해 grep -f를 수행하고 싶지만 첫 번째 파일의 줄과 파일 #1의 $2와 일치하는 파일 #2의 전체 줄도 검색하고 싶습니다.

기본적으로 내 출력이 다음과 같기를 원합니다.

Locus_1 univ university GO:000001
Locus_2 anc  advanced   GO:000003

어떻게 해야 하나요? 루프를 사용하여 첫 번째 파일을 한 줄씩 구문 분석 for한 다음 해당 줄을 변수에 저장할 수 있다고 생각했지만 성공하지 못했습니다.

저는 Windows에서 Cygwin 쉘을 사용하고 있습니다.

답변1

이를 파일에 저장 patterns.awk하고 을 호출합니다. awk -f patterns.awk patterns data여기서 patterns첫 번째 파일은 어디에 있고 data두 번째 파일은 다음과 같습니다.

NR == FNR {
    prefix[NR] = $0;
    pattern[NR] = $2;
    count++;
    next;
}

{
    for (i = 1; i <= count; i++) {
        if (index($1, pattern[i]) > 0) {
            print prefix[i] " " $0;
            next;
        }
    }
}

작동 방식은 다음과 같습니다. 스키마 파일을 읽을 때 첫 번째 규칙이 사용됩니다. 즉, 총 레코드 수가 파일의 레코드 수와 동일하다는 것입니다. 검색할 라인과 패턴을 두 개의 배열에 저장하고 계속 진행합니다. 두 번째 규칙은 총 레코드 수가 파일의 레코드 수를 초과할 때, 즉 데이터 파일을 읽을 때 사용됩니다. 행의 첫 번째 열과 일치하는 패턴이 있는지 확인합니다. 그렇다면 패턴 파일에서 일치하는 줄을 인쇄한 다음 데이터 파일에서 일치하는 줄을 인쇄합니다.

관련 정보