다음 TSV 파일(추출)이 있습니다.
파일 1:
NC_002163.1 RefSeq source 1 1641481 . + . organism=Campylobacter jejuni subsp. jejuni NCTC 11168;mol_type=genomic DNA;strain=NCTC 11168;sub_species=jejuni;db_xref=taxon:192222
NC_002163.1 RefSeq misc_feature 19386 19445 . - . inference=protein motif:TMHMM:2.0;note=3 probable transmembrane helices predicted for Cj0012c Further possible text
NC_002163.1 RefSeq misc_feature 19482 19550 . - . inference=protein motif:TMHMM:2.0;note=3 probable transmembrane helices predicted for Cj0014c Sometimes there is more text
NC_002163.1 RefSeq misc_feature 22853 22921 . - . inference=protein motif:TMHMM:2.0;note=5 probable transmembrane helices predicted for Cj0017c
...
보시다시피 마지막 열에는 일부 식별자( Cj0014c, Cj0017c, etc
)가 포함되어 있습니다. 이 ID 중 일부는 다른 파일에 저장되어 있습니다.
파일 2:
Cj0012c
Cj0027
CjNC9
Cjp01
SRP_RNA_Cjs03
CjNC11
CjNC1
Cj0113
Cjp03
Cj0197c
Cj0251c
awk(또는 bash-script-tool)를 사용하여 파일 1에서 다음 줄을 제거하려면 어떻게 해야 합니까?하위 문자열마지막 열에는 파일 2에서 발견된 ID가 있습니까? 예를 들어, 파일 1의 두 번째 줄은 Cj0012c
파일 2에 있고 파일 1에 있는 해당 줄의 마지막 열에 있는 문자열의 일부이기 때문에 삭제됩니다 .
나는 이 문제로 몇 시간 동안 어려움을 겪었으므로 도움을 주시면 감사하겠습니다. (가능하다면 코드에 대한 설명도 부탁드립니다!)
답변1
시도해 볼 수 있는 몇 가지 옵션이 있습니다. 모두 두 번째 파일에서 연관 배열을 구성한 다음 첫 번째 파일의 마지막 필드에 대해 해당 요소를 테스트하고 일치 항목이 발견되면 중단하는 방식을 기반으로 합니다.
진정한 하위 문자열 일치
awk -F'\t' 'NR==FNR{a[$1]; next} {for(i in a) {if(index($NF,i)>0) next}} 1' File2 File1
(예를 들어) 이는 및/또는의 하위 문자열
Cj0012c
로 식별됩니다.ABCj0012c
Cj0012cdef
위와 유사하지만 부분 단어 일치를 방지하기 위해 요소의 양쪽을 공백 문자로 채웁니다.
awk -F'\t' 'NR==FNR{a[$1]; next} {for(i in a) {if(index($NF," "i" ")>0) next}} 1' File2 File1
a[" "$1" "]
(원하는 경우 배열 할당 호출에 문자열을 채울 수 있습니다)(GNU awk가 필요할 수 있음) 정규식을 사용하여
File2
묶인 문자열로 구성된 패턴을 일치시킵니다.단어 경계 앵커gawk -F'\t' 'NR==FNR{a[$1]; next} {for(i in a) {if($NF ~ "\\<" i "\\>") next}} 1' File2 File1
이 버전의 잠재적인 문제는 요소
File2
에 정규식 메타 문자가 포함될 수 있다는 것입니다. 이러한 문자는 어떤 방식으로든 이스케이프해야 합니다.
답변2
Perl에 대한 약간의 지식:
perl -MList::Util=any -Mautodie -F'\t' -ane '
BEGIN { open $f, "<", shift @ARGV; chomp(@exclusions = <$f>); }
print unless any {$F[-1] =~ /\b\Q$_\E\b/} @exclusions;
' file2 file1
BEGIN 줄에는 파일의 제외 태그 목록이 포함되어 있습니다.
인쇄 라인은 이러한 라인과 일치하는 라인을 필터링합니다.