合并具有不同计数值的多个文件

时间:2015-09-22 18:20:01

标签: awk

我想通过从每个文件中取第二列来合并96个文件,并保留所有文件之间相似的第一列。我试图在R中做到这一点,但是假设它在终端会更好。它是否可以使用awk?

示例数据:

DMED7013:Rfam robinm$ head Rfam_Counts_combined_SplitRfam_Counts_combinedhtseq_Rfamoutput402R.sam
Seq_../trimmed/402R.tally.fasta __not_aligned
__too_low_aQual 3
mir-10 5
Y_RNA 4
__too_low_aQual 0
__too_low_aQual 0
__not_aligned 1
mir-8 2
mir-671 3
mir-671 16

文件:

DMED7013:Rfam robinm$ ls -l  
-rw-r--r--   1 robinm  staff  1711388 Sep 22 19:12 Rfam_Counts_combined_SplitRfam_Counts_combinedhtseq_Rfamoutput100G.sam
-rw-r--r--   1 robinm  staff  1712778 Sep 22 19:12 Rfam_Counts_combined_SplitRfam_Counts_combinedhtseq_Rfamoutput100R.sam
-rw-r--r--   1 robinm  staff  1709703 Sep 22 19:12 Rfam_Counts_combined_SplitRfam_Counts_combinedhtseq_Rfamoutput106G.sam
-rw-r--r--   1 robinm  staff  1707486 Sep 22 19:12 Rfam_Counts_combined_SplitRfam_Counts_combinedhtseq_Rfamoutput106R.sam
-rw-r--r--   1 robinm  staff  1704757 Sep 22 19:12 Rfam_Counts_combined_SplitRfam_Counts_combinedhtseq_Rfamoutput122G.sam
-rw-r--r--   1 robinm  staff  1705471 Sep 22 19:12 Rfam_Counts_combined_SplitRfam_Counts_combinedhtseq_Rfamoutput122R.sam
.....

2 个答案:

答案 0 :(得分:2)

你可以尝试(如果我理解正确的话)

awk '!($1 in d){d[$1]=$2; next}
     {d[$1]+=$2}
     END{for(key in d) print key, d[key]; }' *.sam

你得到:

__too_low_aQual 3
mir-671 19
mir-8 2
__not_aligned 1
Y_RNA 4
mir-10 5

答案 1 :(得分:2)

此脚本将执行您需要的操作

 t0=mktemp; touch t0; 
 for f in prefix*.csv; 
     do paste t0 <(cut -d" " -f2 $f) > t1 && mv t1 t0; 
     done; 
 tr '\t' ' ' <t0 && rm t0

使用剪切/粘贴来收集临时文件中的第二列;完成后,在打印结果后删除临时文件。

保留第一列更改touch t0cut -d" " -f1 oneofthefiles.csv > t0

或者,请求救援!

awk '
    {a[FNR]=a[FNR]?a[FNR] OFS $2:$1} 
 END{for(i=1;i<=FNR;i++) print a[i]}
    ' prefix*.csv

根据行号组合所有文件中的第二个字段,保留第一个文件中的第一个字段。