두 파일 사이를 grep하고 파일 1의 빈 줄을 유지합니다.

두 파일 사이를 grep하고 파일 1의 빈 줄을 유지합니다.

질문이 있습니다 grep.

때로는 개체 사이에 하나 이상의 빈 줄이 있는 Uniprot_interactors.txt코드 목록(예: )이 포함된 파일이 있습니다 .GRT986E

다른 경우에는 TRY546 _ TRE578대시(예를 들어)로 구분된 두 부분으로 구성된 객체가 있으며 선은 비어 있는 것으로 간주되어야 합니다.

Good_interactors.txt그 다음에 는 코드 목록이 포함된 또 다른 파일이 있고 각 파일에는 관련 변수(예: aaaaaa)가 있습니다. output.txt이 파일에서 출력()을 가져오고 싶지만 grep첫 번째 파일처럼 줄을 비워두고 싶습니다.

한 가지 예:

  • 파일 1:UNIPROT_interactors.txt

    QR846OI
    
    PO3R56
    UJ6Y68
    
    
    YU654R
    
    PL92WS
    GH654Y _ HUY765R
    PIHYUD
    
  • 파일 2:GOOD_Interactors.txt

    TYRT68Y aaaaaaaaa
    QR846OI bbbbbbbbb
    FDR59I cccccccc
    PO3R56 ddddddd
    UJ6Y68 eeeeeee
    VFR6y7 fffffff
    PIHYUD gggggggg
    UH7609 hhhhhhhh
    
  • 파일 output.txt(파일 1과 동일한 형식)

    QR846OI bbbbbbbbb
    
    PO3R56  ddddddd
    UJ6Y68 eeeeeee
    
    
    YU654R
    
    PL92WS
    GH654Y _ HUY765R
    PIHYUD gggggggg
    

이 코드를 사용해 봅니다.

grep -f Uniprot_interactors.txt GOOD_interactors.txt > output.txt

그러나 파일 1의 형식은 유지되지 않으며 빈 줄이 제거되었습니다.

답변1

특정 정규식과 일치하는 행(또는 경우에 따라 단어)을 추출하는 것이 grep목적이므로 여기서는 사용할 수 없습니다 . grepgrep유틸리티는 사용자가 원하는 대로 데이터를 수정하지 않습니다(한 파일에서 다른 파일로 줄에 데이터 추가).


Uniprot 식별자로 키가 지정된 awk연관 배열에 좋은 상호 작용자를 저장 하는 데 사용됩니다 . names그런 다음 첫 번째 열의 Uniprot 식별자를 기반으로 이러한 상호작용자를 출력합니다(여러 열이 있거나 알려진 양호한 상호작용자가 변경되지 않은 행을 전달하는 동안).

$ awk 'FNR==NR { names[$1] = $0; next } NF > 1 || !($1 in names) { print; next } { print names[$1] }' GOOD_Interactors.txt UNIPROT_interactors.txt
QR846OI bbbbbbbbb

PO3R56 ddddddd
UJ6Y68 eeeeeee


YU654R

PL92WS
GH654Y _ HUY765R
PIHYUD gggggggg

awk이 두 파일을 명령에 대한 입력 으로 사용하고 있다는 점에 유의하세요 . 첫 번째 파일을 읽을 때는 FNR==NR기준을 충족하는 블록만 트리거되고, 두 번째 파일을 읽을 때는 해당 블록을 건너뜁니다.

특수 변수 FNR, NRNF는 읽은 레코드(행) 수입니다.현재의파일에서 읽은 레코드 수와 현재 레코드의 필드(열) 수입니다.

답변2

비어 있으면 file1 줄을 반복하고, 그렇지 않으면 해당 데이터를 grep하고 인쇄합니다.

while read line ; do
    if ((${#line}));then
        grep "${line}" file2
    else
        echo
    fi
done < file1 > output.txt

또는

file2content="$(cat file2)";
while read line ; do
    if ((${#line}));then
        grep "${line}" <<< "${file2content}"
    else
        echo
    fi
done < file1 > output.txt

관련 정보