다음과 같은 파일이 있습니다.
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
NF
awk
각 레코드 (행)를 분할 하는 필드 (열) 수입니다 . $(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]