탭으로 구분된 9개의 열이 있는 대용량 파일이 있습니다. 파일 크기는 약 39MB이고 줄 수는 약 250,000개입니다. 마지막 열인 9번째 열에는 이 정보가 포함되어 있습니다. (이것은 모두 하나의 열입니다. 공백은 새 열을 나타내지 않고 해당 열의 "데이터"만 나타냅니다.)
TF_binding_site_cage_181208 ZNFN1A2-91741 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_+_149850517
TF_binding_site_cage_181208 ZNFN1A2-92447 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_-_153016326
TF_binding_site_cage_181208 ZNFN1A2-92446 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_-_153016326
TF_binding_site_cage_181208 ZNFN1A2-92445 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_-_153016326
TF_binding_site_cage_181208 SNAI1-3-177789 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_+_52294530
TF_binding_site_cage_181208 SNAI1-3-178434 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_-_52294717
TF_binding_site_cage_181208 SNAI1-3-178161 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_-_52604408
TF_binding_site_cage_181208 SNAI1-3-177489 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_-_52936367
TF_binding_site_cage_181208 MEF2A,C,D-173519 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr8_+_144711658
TF_binding_site_cage_181208 MEF2A,C,D-173496 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr8_-_145085726
TF_binding_site_cage_181208 MEF2A,C,D-172831 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr8_+_145136211
TF_binding_site_cage_181208 MEF2A,C,D-173254 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr9_+_696759
기본적으로 "MEF2*"만 포함된 행을 찾고 있으므로 위의 예에서는 마지막 4개 행만 선택합니다. 또한 이 열뿐만 아니라 전체 행도 원합니다.
나는 이것을 awk-ing하고 Excel로 가져오고 R로 가져오려고 시도했지만 때때로 내 접근 방식이 작동하지만 모든 행을 얻었는지 "확인"할 수 없는 것이 걱정됩니다. (MEF2를 포함하는 행은 수천 행에 걸쳐 있으므로 수동으로 계산하기가 어렵습니다.)
(매우 작은) 오류 없이 이러한 행을 추출하는 데 도움이 되는 알고리즘을 생각할 수 있는 사람이 있습니까? 이것이 기본적인 것인 것은 알지만, 모든 행을 추출하기에는 정규식 기술이 충분하지 않은 것이 걱정됩니다.
답변1
그러면 열 9가 일치하는 모든 행이 제공됩니다 MEF2
.
awk -F"\t" '$9~/MEF2/' file > output
파일이 다음과 같다고 가정합니다.언제나탭으로 구분하면 작동하며 안심할 수 있습니다. 이는 얻을 수 있는 오차 한계가 0에 가깝습니다.
그러나 R과 같은 항목을 가져오려고 시도했지만(아마도 를 사용하여 read.table("file",sep="\t")
) 작동하지 않는 경우 필드 수가 다른 일부 행이 있을 수 있습니다(확인 방법은 끝 부분 참조). 그렇다면 항상 마지막 필드에 관심이 있다고 가정하면 필드 수에 관계없이 $(NF)
in을 사용하여 마지막 필드를 인쇄할 수 있습니다.awk
awk -F"\t" '$(NF)~/MEF2/' file > output
그래도 확인이 필요하다고 생각되면 MEF2
일치 항목이 어디에 있든 상관없이 일치하는 행을 모두 추출하고 결과를 비교할 수 있습니다.
grep MEF2 file > output2
wc
일단 그것을 가지고 나면 동일한 수의 행이 있는지 확인하는 데 사용할 수 있습니다 . 그렇지 않은 경우 다음을 실행하여 차이점을 알아보세요.
grep -vFf output output2
이 명령은 출력1에 없는 출력2의 모든 행을 인쇄합니다. 어쨌든 그들은 MEF2
라인업 어딘가에 있을 가능성이 있지만 9회에는 그렇지 않습니다. 9번째 필드에 있으면 파일이 탭으로 구분되지 않았으며 데이터에 문제가 있는 것입니다.
위의 방법은 awk
아마도 가장 간단한 솔루션일 것입니다. 그러나 동일한 작업을 수행하는 다른 솔루션은 다음과 같습니다.
진주
perl -F"\t" -lane '$F[8]=~/MEF2/ && print' file
sed
(9개 이상의 필드가 있는 경우 이 줄이 잘못된 줄과 일치할 수 있습니다.)sed -n '/\t.*\t.*\t.*\t.*\t.*\t.*\t.*\t.*MEF2.*/p' file
grep
grep -P '^.+?\t.*\t.*\t.*\t.*\t.*\t.*\t.*\t.*MEF2.*' file
이들 모두가 동일한 출력을 생성하지 않으면 파일에 문제가 있는 것입니다. 확인할 수 있는 또 다른 사항은 모든 행에 9개의 필드가 있는지 확인하는 것입니다. 그렇지 않으면 문제가 있는 것입니다.
awk -F"\t" 'NF!=9' file
위의 코드는 9개의 탭으로 구분된 필드를 포함하지 않는 모든 줄을 인쇄합니다. 출력이 있으면 인쇄되는 행에 문제가 있는 것입니다.