Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 通过多列和子字符串查找两个表之间的重叠_Unix_Awk_Terminal - Fatal编程技术网

Unix 通过多列和子字符串查找两个表之间的重叠

Unix 通过多列和子字符串查找两个表之间的重叠,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";

我想得到基于三列的两个表之间的重叠

文件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"; 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票真的很沮丧:(请在这里帮助我)。