awk는 여러 구분 기호가 있는 파일에서 줄을 인쇄합니다.

awk는 여러 구분 기호가 있는 파일에서 줄을 인쇄합니다.

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

chr1    1197592 .   C   A   .   .   DP=67;ECNT=1;NLOD=8.12  GT:AD:AF:F1R2   0/1:37,2:0.063:13,0
chr1    1355707 .   G   T   .   .   DP=69;ECNT=1;NLOD=4.51  GT:AD:AF:F1R2   0/1:50,3:0.059:20,3
chr1    1641723 .   TC  T   .   .   DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4
chr1    2550056 .   TC  CT  .   .   DP=99;ECNT=1;NLOD=9.03  GT:AD:AF:F1R2   0/1:63,2:0.053:33,2

10열의 세 번째 값이 0.06보다 큰 행을 인쇄하고 싶습니다.

cat file.txt | cut -f 10 | cut -f 3 | awk -F':' '$3>0.06'

나에게만 줄 것이다:

0/1:37,2:0.063:13,0
0/1:30,2:0.089:12,4

나는 전체 라인을 원한다. awk를 사용하여 수행할 수 있습니까?

답변1

파이프라인에서 데이터를 버리기 시작하면(실제로 수행함 cut) 동일한 파이프라인의 후속 단계에서 해당 데이터를 다시 가져올 수 없습니다.

대신에,

$ awk 'split($10,a,":") && a[3] > 0.06' file
chr1    1197592 .   C   A   .   .   DP=67;ECNT=1;NLOD=8.12  GT:AD:AF:F1R2   0/1:37,2:0.063:13,0
chr1    1641723 .   TC  T   .   .   DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4

이는 공백으로 구분된 10번째 필드를 가져와 콜론으로 나누어 array 로 만듭니다 a. split()에서 생성된 요소 a와 의 세 번째 요소가 0.06보다 큰 경우 a원래 줄을 인쇄합니다.

파일의 필드가 탭으로 구분되어 있고 필드에 공백이 포함된 경우 -F '\t'with를 사용하여 awk올바른 필드를 올바르게 찾을 수 있는지 확인하세요(내가 아는 한, 주어진 샘플 데이터에는 그러한 문제가 없습니다).


주소 지정댓글의 후속 질문:

awk 'split($10,a,":") && a[3] > 0.06 && split($11,b,":") && b[3] > 0.01' file

답변2

awk -F':' '$(NF-1) > 0.06 {print $0}' file

":"를 구분 기호로 사용하고 두 번째 열부터 마지막 ​​열까지 평가하세요.

답변3

주석을 읽은 후에는 예제 데이터가 실제 데이터와 일치하지 않지만(처음에는 탭 대신 공백을 사용하므로 자신의 장치에 대한 명령 출력도 작동하지 않음을 의미함) 서로 엮인 것이 분명합니다. a another 다음과 같이 파일을 입력하세요.

cat file.txt
chr1    1197592 .       C       A       .       .       DP=67;ECNT=1;NLOD=8.12  GT:AD:AF:F1R2   0/1:37,2:0.063:13,0     0/1:37,2:0.0005:13,0
chr1    1355707 .       G       T       .       .       DP=69;ECNT=1;NLOD=4.51  GT:AD:AF:F1R2   0/1:50,3:0.059:20,3     0/1:50,3:0.0005:20,3
chr1    1641723 .       TC      T       .       .       DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4     0/1:30,2:0.0015:12,4
chr1    2550056 .       TC      CT      .       .       DP=99;ECNT=1;NLOD=9.03  GT:AD:AF:F1R2   0/1:63,2:0.053:33,2     0/1:63,2:0.0005:33,2

그러면 일치하는 모든 줄이 출력됩니다.둘 다상황:

awk -F"[  :]" '$15>0.06 && $19>0.001' file.txt
chr1    1641723 .   TC  T   .   .   DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4 0/1:30,2:0.0015:12,4

답변4

결과를 얻기 위해 다음 방법을 사용합니다.

for  i in `awk  '{print $NF}' file.txt | awk -F ":" '$3>"0.06"{print $0}'`; do awk -v i="$i" '$NF ==i{print $0}' file.txt ;done

산출

chr1    1197592 .   C   A   .   .   DP=67;ECNT=1;NLOD=8.12  GT:AD:AF:F1R2   0/1:37,2:0.063:13,0
chr1    1641723 .   TC  T   .   .   DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4
[root@praveen_linux_example ~]#

관련 정보