특정 문자열로 시작하는 열 인쇄 addinfor ID102

다음과 같은 파일이 있습니다.

ID101     G    T     freq=.5     nonetype     ANC=.1     addinfor
ID102     A    T     freq=.3     ANC=.01    addinfor
ID102     A    T     freq=.01     type=1     ALT=0.022    ANC=.02    addinfor

보시다시피, 각 줄에는 열 수가 약간 다릅니다. 특히 열 1, 열 2, 열 3, 열 4와 열로 시작하는 열을 원합니다.ANC=

원하는 출력 :

ID101     G    T     freq=.5     ANC=.1
ID102     A    T     freq=.3     ANC=.01
ID102     A    T     freq=.01    ANC=.02

일반적으로 awk 명령을 사용하여 파일을 구문 분석합니다.

awk 'BEGIN {OFS = "\t"} {print $1, $2, $3, $4}'

이와 같은 상황에서 작동하도록이 명령을 변경하는 쉬운 방법이 있습니까?

나는 이와 같은 것이 효과가 있다고 생각한다.

awk '{for(j=1;j<=NF;j++){if($j~/^ANC=/){print $j}}}'

그러나 첫 번째 열도 인쇄하도록 어떻게 편집 할 수 있습니까?



답변

awk:

awk '{for(i=5;i<=NF;i++){if($i~/^ANC=/){a=$i}} print $1,$2,$3,$4,a}' file

  • for(...)필드 5 ( i=5)로 시작하여 모든 필드를 반복합니다 .
    • if($i~/^ANC=/) 필드가로 시작하는지 확인 ANC=
    • a=$i 그렇다면 변수 a를 해당 값으로 설정하십시오.
  • print $1,$2,$3,$4,a인쇄 필드 1-4 어떤 다음은에 저장됩니다 a.

BEGIN {OFS="\t"}물론 결합 할 수 있습니다 .


답변

ANC=열이 항상 두 번째에서 마지막 열 이라고 가정합니다 (예제 데이터에서와 같이).

$ awk '{ print $1, $2, $3, $(NF-1) }' data.in
ID101 G T ANC=.1
ID102 A T ANC=.01
ID102 A T ANC=.02

NFawk각 레코드 (행)를 분할 하는 필드 (열) 수입니다 . $(NF-1)마지막에서 두 번째 필드의 값입니다.


답변

perl -pale '$"="\t", $_="@{[@F[0..3],         grep {   /^ANC=/ } @F[4..$#F]]}"' yourfile
perl -lane '$,="\t",          print @F[0..3], grep {   /^ANC=/ } @F[4..$#F]'    yourfile
perl -lane '($,,$a)=("\t",0), print grep { $a++ < 4 or /^ANC=/ } @F'            yourfile

간결한

$, => OFS @F[0..3]=>$F[0] $F[1] $F[2] $F[4]


답변