파일 1을 파일 2와 일치

파일 1을 파일 2와 일치

두 개의 파일이 있습니다. File1에는 유전자 상호 작용(유전자 기호)이 있고 다른 File2에는 유전자 기호와 해당 Ensembl ID가 있습니다.

파일 1

GeneA GeneB
GeneA GeneD
GeneC GeneB

파일 2

GeneA    Ensembl1
GeneB    Ensembl2
GeneC    Ensembl3 

이제 아래와 같은 출력이 있는 파일 File3을 원합니다.

GeneA Ensembl1 GeneB Ensembl2
GeneA Ensembl1 GeneD NA
GeneC Ensembl3 GeneB Ensembl2

File2에 GeneD가 없어 해당 유전자의 Ensembl ID를 찾을 수 없으면 해당 유전자에 대해 NA가 입력됩니다. 누구든지 구현하도록 도와줄 수 있나요?

답변1

해결책:

awk 'NR==FNR{ a[$1]=$2; next }
     { $1=$1 FS (($1 in a)? a[$1]:"NA"); $2=$2 FS (($2 in a)? a[$2]:"NA"); }1' File2 File1

산출:

GeneA Ensembl1 GeneB Ensembl2
GeneA Ensembl1 GeneD NA
GeneC Ensembl3 GeneB Ensembl2

답변2

perl -lane '
   @ARGV and $h{$F[0]}=$F[1],next;
   print join $", map { $_ , $h{$_} // "NA" } @F;
' File2 File1

결과

GeneA Ensembl1 GeneB Ensembl2
GeneA Ensembl1 GeneD NA
GeneC Ensembl3 GeneB Ensembl2

피복재

  • 먼저 File2가 매개변수 목록에서 Perl에 제공되고 그 다음 File1이 제공됩니다.
  • %hGeneA, GeneB 등의 키를 사용하여 해시를 구축합니다 . => 값은 File2의 모음입니다. File2를 처리할 때 @ARGV에 요소가 있으므로 스칼라 컨텍스트의 @ARGV는 true를 반환합니다.
  • File1을 읽는 동안 @ARGV는 0으로 줄어들므로 첫 번째 줄은 평가되지 않습니다. 두 번째 줄은 적절한 매핑 변환 후 공백으로 연결된 필드를 인쇄합니다($"의 기본값은 공백입니다).

관련 정보