我有两个大文件,如下所示:
f1:
chr1,3073253,3074322,gene_id,"ENSMUSG00000102693.1",gene_type,"TEC"
chr1,3074253,3075322,gene_id,"ENSMUSG00000102693.1",transcript_id,"ENSMUST00000193812.1"
chr1,3077253,3078322,gene_id,"ENSMUSG00000102693.1",transcript_id,"ENSMUST00000193812.1"
chr1,3102916,3103025,gene_id,"ENSMUSG00000064842.1",gene_type,"snRNA"
chr1,3105016,3106025,gene_id,"ENSMUSG00000064842.1",transcript_id,"ENSMUST00000082908.1"
Run Code Online (Sandbox Code Playgroud)
f2:
chr,name,start,end
chr1,linc1320,3073300,3074300
chr3,linc2245,3077270,3078250
chr1,linc8956,4410501,4406025
Run Code Online (Sandbox Code Playgroud)
我想要做的是在文件 1 的单独列中打印文件 2 的行,如果file2的范围start和end列在 file1 的范围内(第 2 列和第 3 列)并且chr相同。因此,基于我提供的虚拟示例文件 - 所需的输出应该是(只有范围linc1320在 file1 的第一行):
chr1,3073253,3074322,gene_id,"ENSMUSG00000102693.1",gene_type,"TEC",linc1320,3073300,3074300
chr1,3074253,3075322,gene_id,"ENSMUSG00000102693.1",transcript_id,"ENSMUST00000193812.1"
chr1,3077253,3078322,gene_id,"ENSMUSG00000102693.1",transcript_id,"ENSMUST00000193812.1"
chr1,3102916,3103025,gene_id,"ENSMUSG00000064842.1",gene_type,"snRNA"
chr1,3105016,3106025,gene_id,"ENSMUSG00000064842.1",transcript_id,"ENSMUST00000082908.1"
Run Code Online (Sandbox Code Playgroud)
我不是专业的编码员,但我一直在使用此代码根据 file2 手动更改范围:
awk -F ',' '$2<=3073300,$3>=3074300, {print $1,$2,$3,$4,$5,$6,$7}' f1.csv
Run Code Online (Sandbox Code Playgroud)
我没有使用特定的编程语言有特别的爱好-无论是Python和awk将是非常有益的。感谢您提供任何帮助。
我有一个如下所示的数据框:
chr1,A,1,3,y,-
chr1,A,2,30,y,-
chr1,A,12,40,y,-
chr2,B,0,3,y,-
chr2,B,1,30,y,-
chr3,C,1,3,y,-
Run Code Online (Sandbox Code Playgroud)
我想按第二列进行分组,然后使用 bash 获取第三列的最小值和第四列的最大值。所以期望的输出应该是:
chr1,A,1,40,y,-
chr2,B,0,30,y,-
chr3,C,1,3,y,-
Run Code Online (Sandbox Code Playgroud)
我设法构建了一个粗略的代码来执行此操作,但它并没有完全给出最终输出。
这是代码:
awk 'BEGIN{FS=OFS=","} {if (!( $2 in min )) { min[$2] = $3; max[$2] = $4; row[$2] = $0 } else { if ($3 < min[$2]) min[$2] = $3; if ($4 > max[$2]) max[$2] = $4; row[$2] = $0 } } END { for (key in row) print row[key] }'
Run Code Online (Sandbox Code Playgroud)
我用这段代码得到的最终输出是:
chr1,A,2,30,y,-
chr2,B,1,30,y,-
chr3,C,1,3,y,-
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到我想要的输出?有没有更简单的代码可以在 bash 中执行此操作?谢谢。
我有一个数据框,想要根据第一列中的名称与向量中的名称的部分匹配来过滤它。
nam <- c('mmu_mir-1-3p','mmu_mir-1-5p','mmu-mir-3-5p','mir-4','mmu-mir-6-3p') #factor
aa <- c('12854','36','5489','54485','2563') #numeric
df <- data.frame(nam,aa)
vector <- c('mir-1','mir-3','mir-6')
Run Code Online (Sandbox Code Playgroud)
我需要在新数据框中包含行,其中的名称df$nam与 中的名称部分匹配vector。所以new_df应该看起来像这样。
new_nam <- c('mmu_mir-1-3p','mmu_mir-1-5p','mmu-mir-3-5p','mmu-mir-6-3p') #factor
new_aa <- c('12854','36','5489','2563') #numeric
new_df <- data.frame(new_nam,new_aa)
Run Code Online (Sandbox Code Playgroud) 我尝试了所有解决方案,但我的问题仍然存在。我有一个很大的 df (20rows*400cols) - 对于每一行,我想计算有多少列的值超过 16。
第一个列是因子,其余的列是整数。
我的 df:
col1 col2 col3 col4
abc 2 16 17
def 4 2 4
geh 50 60 73
Run Code Online (Sandbox Code Playgroud)
所需的输出应该是:
col1 col2 col3 col4 count
abc 2 16 17 1
def 4 2 4 0
geh 50 60 73 3
Run Code Online (Sandbox Code Playgroud)
我试过了,df$morethan16 <- rowSums(df[,-1] > 16) 但后来我进入NA了count专栏。
我有一个包含数千行的大文件,如下所示:
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00002235.4
TTACGCAT
TAGGCCAG
>ENST00005546.9
TTTATCGC
TTAGGGTAT
Run Code Online (Sandbox Code Playgroud)
>例如,我想 grep 特定的 id(在符号之后),ENST00001234.1然后想在匹配之后获取行直到下一个>[不管行数]。我想以这种方式一次 grep 大约 63 个 ID。
如果我 grepENST00001234.1和ENST00005546.9ids,理想的输出应该是:
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00005546.9
TTTATCGC
TTAGGGTAT
Run Code Online (Sandbox Code Playgroud)
我试过了,awk '/ENST00001234.1/ENST00005546.9/{print}'但没有帮助。