필드의 값을 일치시키고 일치 항목에 따라 ID를 할당합니다.

필드의 값을 일치시키고 일치 항목에 따라 ID를 할당합니다.
chr:pos1:pos2   Sun     NC      S1      S2      S3      S4      S9      S11     S14     S15     S16     S17     S18     S19     S28     S29     S30     S33     S34     S35     S36     S37     S38     S39
Aradu.A01:100145549:100145556   AG      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA
Aradu.A01:100408119:100408137   CA      TA      0       0       0       TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      0
Aradu.A01:10102206:10102212     TG      TA      TA      TA      TA      0       TG      TA      TA      TA      TG      TG      TG      TG      TG      TA      TG      TG      TA      0       TG      TG
Aradu.A01:10112010:10112029     GA      GG      GG      GG      GG      GG      GA      GG      GG      GG      GA      0       GA      GA      GA      GG      GA      GA      GG      GA      0       GA
Aradu.A01:10112029:10112059     AC      GC      GC      GC      GC      GC      AC      GC      GC      GC      AC      0       AC      AC      AC      GC      AC      0       GC      AC      0       AC
Aradu.A01:101198026:101198058   GT      GC      GC      GC      GT      GC      0       GT      GT      GC      GT      GT      GT      0       GT      GC      GT      GC      GC      GT      0       GT
Aradu.A01:101198058:101198081   TC      CC      CC      CC      TC      CC      0       TC      TC      CC      TC      TC      TC      0       TC      CC      TC      CC      CC      TC      0       TC
Aradu.A01:101306922:101306946   AG      AA      AA      AA      AG      0       AA      AG      AG      AA      0       AG      AG      AG      AG      AA      AG      AG      AA      AG      AG      AG

주어진 파일에서 4열부터 2열과 3열까지 모든 필드의 값을 일치시키려고 합니다. 필드 값(열 4 이상)이 열 2 필드와 일치하면 열 3과 함께 S(일치하는 경우)로 표시하고 N으로 표시하고 0이면 -1을 할당합니다.

내가 시도한 것은 다음과 같습니다.

NR>1  {for(i=4;i<=NF;i++)
        { if ( $i == $2 ) $i=S ;
          if ( $i == $3 ) $i=N ;
          if ( $i == 0 ) $i=-1 ;
       } ## if ;
       ## for loop is done
       print ;
       }

결과적으로 처음 3개 필드를 제외한 모든 필드에는 -1이 할당됩니다.

답변1

이것은 트릭을 수행하는 것 같습니다

NR > 1 {
  for( i=4; i<NF; i++) {
    if( $i == $2 ) {
      $i = "S"
    }
    else if( $i == $3 ) {
      $i = "N"
    }
    else if( $i == 0 ) {
      $i = -1
    }
  }
  print
}

eg라는 파일에 넣고 363142.awk다음을 실행하세요.

$ awk -f 363142.awk /path/to/input

답변2

perl -F\\s+ -pale '
   $. > 1 and /(?:\S+\s+){3}/g and
   s{\G(\S+)(\s*)}
   {
      ($1 eq $F[1] ? "S" : $1 eq $F[2] ? "N" : $1 eq "0" ? -1 : $1) . $2
   }cge;
' your_genes_file

옵션

  • -F\\s+FS하나 이상의 공백으로 설정 =>/\s+/
  • -p암시적 파일 루프가 읽기용으로 설정되고 인쇄가 자동으로 수행됩니다.
  • -a-F각 레코드는 옵션에서 제공하는 필드 분할 구분 기호나 기본 단일 공백을 기준으로 다시 분할됩니다 . 이러한 필드는 배열에 저장됩니다 @F.
  • -l설정할 것이다ORS=RS=\n
  • -ePerl각 레코드에 적용할 코드 입니다 .

설명하다

첫 번째 줄 처리를 건너뜁니다. -p옵션은 신중하게 인쇄합니다. 그런 다음 정규식 엔진 태그를 네 번째 필드의 시작 부분에 배치합니다. 왜냐하면 모든 것이 여기에서 시작되어야 하기 때문입니다. 그런 다음 , 및 모드에서 명령을 적용합니다 s///. => 정규식 토큰은 처음부터가 아닌 마지막 명령에 저장된 위치부터 시작됩니다. => 변환할 전체 라인을 살펴보고 교체 부분을 실행할 코드로 간주하며 그 결과는 교체 부분에 저장됩니다.globalcumulativeeval/cm//g/g/es//repl/Perl

GNU sed

작성할 수는 있지만 POSIX sed코드가 명확성을 방해하므로 적당한 수준의 연습으로만 사용해야 합니다.

sed -e '
   1b

   # fence the column 2 and go looking for col2 matching fields from col 4 onwards
   s/\S\+/\n&\n/2
   :c2
   s/\(\n\(.*\)\n\s\+\S\+\s.*\)\<\2\>/\1S/g;tc2
   s/\n//g

   # fence the column 3 and go looking for col3 matching fields from col 4 onwards
   s/\S\+/\n&\n/3
   :c3
   s/\(\n\(.*\)\n.*\)\<\2\>/\1N/g;tc3
   s/\n//

   # from col 4 onwards look for any lone 0s and change them to -1
   :zm1
   s/\(\n.*\)\<0\>/\1-1/;tzm1
   s/\n//

' gene_file.dat

진주

여기서는 @F 배열 인덱싱을 방해하는 선행 공백을 제거한 다음 데이터를 인쇄할 때 이를 복원합니다. 요소 6을 앞으로 이동 map하고(공백은 4+2) 열 2/3 또는 0과 같은지 확인합니다.

perl -F'(\s+)' -lane '
   print,next if $. == 1;
   my $dummy = splice @F, 0, 2 if /^\h/;
   print $dummy, @F[0..5], map {
      s/^\Q$F[2]\E$/S/ or s/^\Q$F[4]\E$/N/ or s/^0$/-1/; $_
   } @F[6 .. $#F];
' gene_file.dat

관련 정보