간단히

간단히

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

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}}}'

하지만 첫 번째 열을 인쇄하려면 어떻게 편집해야 합니까?

답변1

그리고 awk:

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

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

BEGIN {OFS="\t"}물론 결합도 가능합니다.

답변2

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)두 번째 필드의 값입니다.

답변3

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]

관련 정보