Unix 通过多列和子字符串查找两个表之间的重叠
我想得到基于三列的两个表之间的重叠 文件1Unix 通过多列和子字符串查找两个表之间的重叠,unix,awk,terminal,Unix,Awk,Terminal,我想得到基于三列的两个表之间的重叠 文件1 Chr B C Start End F G E D chr1 HAVANA gene 11869 14409 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1";
Chr B C Start End F G E D
chr1 HAVANA gene 11869 14409 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2";
chr1 HAVANA gene 100000 112000 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2";
chr3 HAVANA gene 11870 14409 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2";
chr3 HAVANA gene 11839 11869 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2";
chr2 HAVANA gene 11869 14409 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2";
文件2
A B Start End Chr D
ENSG00000177697 ENST00000525333 832986 833026 11 1
ENSG00000197283 ENST00000876382 100000 112000 1 1
ENSG00000194582 ENST00000184632 11869 14409 2 1
ENSG00000174528 ENST00000241053 154728 184728 12 1
ENSG00000103629 ENST00000816493 832986 917483 13 1
ENSG00000183628 ENST00000816472 711633 782163 11 1
ENSG00000192748 ENST00000164924 832986 982732 CHK_1231 1
ENSG00000183643 ENST00000917473 183728 194873 3 1
ENSG00000183647 ENST00000184637 800000 819483 2 1
ENSG00000177697 ENST00000184627 100023 120000 11 1
期望输出:
Chr B C Start End F G E D
chr1 HAVANA gene 100000 112000 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2";
chr2 HAVANA gene 11869 14409 . + . gene_id "ENSG00000223972.5"; gene_type "transcribed_unprocessed_pseudogene"; gene_status "KNOWN"; gene_name "DDX11L1"; level 2; havana_gene "OTTHUMG00000000961.2";
问题是,文件2中第5列的数字是第一个文件第1列的子字符串(因此,不是11,而是chr11)。表2的第4列和第5列应等于文件1中的第4列和第5列(开始和结束)。我希望输出与文件1完全相同,只是元素应该与文件2中的元素相同
我不熟悉awk语法,对我来说这并不直观,但我在浏览之前的文章时发现,这一行,我想可以扩展这个命令:
awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1 > file1_subset2
@艾尔:试试看:
awk 'FNR==NR{sub(/[[:alpha:]]+/,"",$1);A[$1,$4,$5]=$0;next} {sub(/[[:alpha:]]+/,"",$(NF-1));} ((($NF-1),$3,$4) in A){print A[($NF-1),$3,$4]}' SUBSEP=, Input_file1 Input_file2
它将打印文件1的值,如果两者都符合您的要求,请尝试,然后让我知道
现在也添加了一个非线性的解决方案
awk 'FNR==NR{
sub(/[[:alpha:]]+/,"",$1);
A[$1,$4,$5]=$0;
next
}
{
sub(/[[:alpha:]]+/,"",$(NF-1));
}
((($NF-1),$3,$4) in A){
print A[($NF-1),$3,$4]
}
' SUBSEP=, Input_file1 Input_file2
EDIT2:添加了一个函数,在该函数中,我可以删除在不同字段中执行相同操作的sub的两次写入
awk 'function remove_chars(a){sub(/[[:alpha:]]+/,"",$a)} FNR==NR{remove_chars($1);A[$1,$4,$5]=$0;next} {remove_chars($(NF-1));} ((($NF-1),$3,$4) in A){print A[($NF-1),$3,$4]}' SUBSEP=, Input_file1 Input_file2
溶液的非线性形式也如下
awk 'function remove_chars(a){
sub(/[[:alpha:]]+/,"",$a)
}
FNR==NR {
remove_chars($1);
A[$1,$4,$5]=$0;
next
}
{
remove_chars($(NF-1));
}
((($NF-1),$3,$4) in A) {
print A[($NF-1),$3,$4]
}
' SUBSEP=, Input_file1 Input_file2
您的问题是要包含更多的示例输入(匹配和不匹配的行)以及给定该输入的预期输出。问题是,文件2中第5列的数字是第一个文件第1列的子字符串(因此不是11而是chr11)。这很令人困惑
11
不是chr1
的子字符串。“它会说”指的是什么?您在问题中是否交替使用表和文件?你说的“应该平等”是什么意思?@MODs:你能告诉我是谁给了我-ve票吗,现在几乎每天都在发生,这让我很沮丧,如果你们能做点什么,我会很感激的,但不要给出适当的理由,接受-ve票真的很沮丧:(请在这里帮助我)。