두 파일을 한 줄씩 비교하여 파일 1의 패턴이 파일 2에서 (전체 또는 일부) 발견되지 않으면 파일 1의 줄을 인쇄합니다.

두 파일을 한 줄씩 비교하여 파일 1의 패턴이 파일 2에서 (전체 또는 일부) 발견되지 않으면 파일 1의 줄을 인쇄합니다.

두 개의 파일이 있습니다.

파일 1(검색):

1  
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT  
2  
GACGGAGGATGCAAGTGTTATCCGGAAT  
3  
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC  
4  
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG 

파일 2(모드):

GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCG
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCCGTAG 

나에게 필요한 것은:

1  
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT  
2  
3  
4  
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG  

즉, 패턴 파일에서 검색 라인을 검색하는 스크립트가 필요하며, 검색 라인을 완전히 또는 부분적으로 찾을 수 있는 경우("2" 이후 라인의 경우) 해당 검색 라인을 작성해서는 안 되고 파일의 다른 모든 라인은 작성해야 합니다. 1.

이 포럼에서 찾은 많은 grep 및 awk 스크립트를 시도했지만 내 요구 사항을 충족하는 스크립트는 없습니다.

awk 'FN==NR {exclude[$0];next} !($0 in exclude)' file2 file1  

또는

awk 'NR==FNR{a[$1]++;next} !($1 in a) {print $1} {next}' file2 file1

나는 또한 grep을 시도했다.

어쨌든, 내가 시도한 모든 스크립트는 부분 일치가 아닌 패턴과 정확히 일치하는 것을 찾았습니다.

누구든지 어떤 아이디어가 있습니까?

답변1

awk스크립트 사용 :

NR == FNR       { seq[++n] = $1; next }

{
    header = $0
    getline

    for (i = 1; i <= n; ++i) {
        if (match(seq[i], $0) > 0) {
            print header
            next
        }
    }

    print header
    print
}

실행하세요:

$ awk -f script.awk file2 file1
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG

스크립트는 먼저 file2배열 에서 2000개의 시퀀스를 읽은 seq다음 배열에서 헤더를 읽은 다음 ( 사용하여 ) file1에서 시퀀스를 읽습니다 . 그런 다음 배열을 반복하여 현재 시퀀스가 ​​포함된 시퀀스를 찾습니다 . 그러한 시퀀스가 ​​발견되면 헤더가 인쇄되고 스크립트는 실행 중인 다음 줄에서 계속됩니다 . 그렇지 않으면 제목과 순서가 인쇄됩니다.file1getlineseqfile1file1

스크립트에는 file1헤더와 시퀀스 라인이 교대로 포함되어 있는 것으로 간주되며 여러 줄의 시퀀스는 포함되지 않습니다.

다음은 동일한 스크립트이지만 DRY 원칙("반복하지 마십시오")을 사용합니다.

NR == FNR       { seq[++n] = $1; next }

{
    header = $0
    getline

    found = 0
    for (i = 1; i <= n; ++i) {
        if (match(seq[i], $0) > 0) {
            found = 1
            break
        }
    }

    print header
    if (!found) print
}

답변2

awk+grep해결책:

awk '/^[^>0-9]/{ 
         m = ""; cmd = sprintf("grep -m1 %s file2", $0);
         cmd | getline m; close(cmd);
         if (m) next; 
     }1' file1
  • cmd- 주요 grep명령
  • m- 가능한 일치 항목으로 채워진 변수

산출:

1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG

답변3

grep -vxf <(grep -of file_1 file_2 | sort -u) file_1

파일 1

1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
GACGGAGGATGCAAGTGTTATCCGGAAT
3
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG

파일_2

GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCG
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCCGTAG

산출

1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG

관련 정보