다음과 같은 파일이 있습니다.
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 ~]#