다음과 같은 파일이 있습니다.
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
NF
awk
각 레코드(행)가 나누어지는 필드(열)의 개수입니다. $(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]