簡體   English   中英

如何打印文件 1 和文件 2 中的行,其中文件 1 中的第 9 列小於文件 2 中的第 4 列

[英]How can I print lines from file1 and file2 where columns 9 in file 1 is less than column 4 in file 2

我需要幫助。 我試過無濟於事。 如何將 file1 和 file2 中的行打印到我的輸出文件,其中 file1 的 column2 與 file2 的 column1 相同,然后 $9 file1 >= $4 file2 && $10 file1 <= $5

文件 1

BG chr20   100.000 15      0       0       1       15      13242327        13242341        5.1     
BG chr2    100.000 15      0       0       1       15      70212527        70212541        5.1     
BG chr2    100.000 15      0       0       1       15      216745730       216745744       5.1     
BG chr1    100.000 15      0       0       1       15       6195235       6195335        5.1   

文件 2

chr1    hg38_refGene    stop_codon      67093005        67093007        
chr1    hg38_refGene    CDS     67093008        67093604        
chr2    hg38_refGene    exon    216645730       216845744        
chr1    hg38_refGene    CDS      6095235      6395421

輸出

BG chr2    100.000 15      0       0       1       15      216745730       216745744       5.1  chr2    hg38_refGene    exon    216645730       216845744 
BG chr1    100.000 15      0       0       1       15       6195235       6195335        5.1    chr1    hg38_refGene    CDS      6095235      6395421  

代碼

awk 'NR == FNR {A[$1] = $0; next} $1 in A {split(A[$1], T)} {if ( T[9] >= $4 && T[10] <= $5 )print A[$1], $0}' file1 file2 >output

join就是為此而設計的。 需要注意的是 join 需要兩個排序的輸入文件(這對於第一次使用的用戶來說通常是一個陷阱)。

所以,試試這個:

join -1 2  <( sort -k2,2 file1 ) <( sort file2 )

這是輸出:

chr1 BG 100.000 15 0 0 1 15 6195235 6195335 5.1 hg38_refGene CDS 6095235 6395421
chr1 BG 100.000 15 0 0 1 15 6195235 6195335 5.1 hg38_refGene CDS 67093008 67093604
chr1 BG 100.000 15 0 0 1 15 6195235 6195335 5.1 hg38_refGene stop_codon 67093005 67093007
chr2 BG 100.000 15 0 0 1 15 216745730 216745744 5.1 hg38_refGene exon 216645730 216845744
chr2 BG 100.000 15 0 0 1 15 70212527 70212541 5.1 hg38_refGene exon 216645730 216845744

然后,您可以根據需要使用 awk 更改列順序。

文件 1 中的密鑰是字段 2,而不是字段 1。

$ awk 'NR==FNR {a[$2]=$0; next} 
       $1 in a {split(a[$1],t); 
                if(t[9]>=$4 && t[10]<=$5) print a[$1], $0}' file1 file2 | column -t

BG  chr2  100.000  15  0  0  1  15  216745730  216745744  5.1  chr2  hg38_refGene  exon  216645730  216845744
BG  chr1  100.000  15  0  0  1  15  6195235    6195335    5.1  chr1  hg38_refGene  CDS   6095235    6395421

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM