2014-03-28 85 views
0

我有2個文件,我想加入的第一列: 文件1包含46395029線和文件2包含86510559.合併/連接兩個大文件

FILE1.TXT

>ID sequence 
CJP75M1:393:C2T21ACXX:8:1101:2069:1997 1:N:0:_45 TAGTATTACGACG 
CJP75M1:393:C2T21ACXX:8:1101:2711:1992 1:N:0:_65 TCCGAGGCCCTGTAATTGGAATGAGTAC 
CJP75M1:393:C2T21ACXX:8:1101:3822:1989 1:N:0:_115 CCGGAGAGGGAGCCTGAGAAACGGCTACCAC 

FILE2.TXT

>ID  Barcode 
CJP75M1:393:C2T21ACXX:8:1101:2069:1997 1:N:0:_45 CTCG 
CJP75M1:393:C2T21ACXX:8:1101:2711:1992 1:N:0:_65  CTAG 
CJP75M1:393:C2T21ACXX:8:1101:3822:1989 1:N:0:_115  CTGG 

我想合併第一科拉姆這兩個文件有:

>TAGTATTACGACG CTCG 
TCCGAGGCCCTGTAATTGGAATGAGTAC  CTAG 
CCGGAGAGGGAGCCTGAGAAACGGCTACCAC  CTGG 

僅在文件1中需要行,因此結果文件應該包含「僅」46395029行。 我使用awk做到了:

awk 'BEGIN {FS= "\t"; OFS="\t"} { while (getline < "file1.txt") { f[$1] = $2} {print $2, f[$1] }}' "file2.txt" | sed '1d' > result.txt 

但它真的很長(2天正在運行)。我有一個64位/ 16G內存的Linux debian(穩定)服務器

任何想法? 由於

+0

是否在文件中以某種方式排列「鍵」? – fge

+0

好奇心,爲什麼java標籤和C標籤? – fge

+0

不,他們不是。事實上,在文件2中我有所有的ID,而在文件1中,這是一個子集 – user1845261

回答

1

下面是另一種方式與awk

awk 'FNR==1{next}NR==FNR{map[$1,$2]=$3;next}(map[$1,$2]){print map[$1,$2],$3}' file2 file1 
  • 從file2的
  • 跳過第一線從兩個文件
  • 創建在柱1和2索引的數組如果file1中存在地圖打印該行
1

這是Java(7+)中的一個解決方案 - 你問爲它:)

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.nio.charset.Charset; 
import java.nio.charset.StandardCharsets; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import static java.nio.file.StandardOpenOption.*; 

public final class Job 
{ 
    private static final Pattern PATTERN 
     = Pattern.compile("(\\S+\\s+\\S+)\\s+(.*)"); 

    public static void main(final String... args) 
     throws IOException 
    { 
     final Map<String, String> fromFile1 = new HashMap<>(); 

     final Charset charset = StandardCharsets.US_ASCII; 
     final Path file1 = Paths.get("/tmp/f1.txt"); 
     final Path file2 = Paths.get("/tmp/f2.txt"); 
     final Path dstfile = Paths.get("/tmp/dst.txt"); 
     Matcher m; 
     String line, key, value; 
     StringBuilder sb; 

     // Lines from file 1 
     try (
      final BufferedReader reader = Files.newBufferedReader(file1, 
       charset); 
     ) { 
      reader.readLine(); 
      while ((line = reader.readLine()) != null) { 
       m = PATTERN.matcher(line); 
       if (m.matches()) 
        fromFile1.put(m.group(1), m.group(2)); 
      } 
     } 

     // Write in destination file 
     try (
      final BufferedReader reader = Files.newBufferedReader(file2, 
       charset); 
      final BufferedWriter writer = Files.newBufferedWriter(dstfile, 
       charset, CREATE, TRUNCATE_EXISTING); 
     ) { 
      reader.readLine(); 
      while ((line = reader.readLine()) != null) { 
       m = PATTERN.matcher(line); 
       if (!m.matches()) 
        continue; 
       key = m.group(1); 
       value = fromFile1.get(key); 
       if (value == null) 
        continue; 
       sb = new StringBuilder(value).append('\t') 
        .append(m.group(2)).append('\n'); 
       writer.write(sb.toString()); 
      } 
      writer.flush(); 
     } 
    } 
} 

把它放在一個文件名爲Job.java。要編譯,你需要一個JDK 7+和:

javac Job.java 

要執行,你將需要相當長的一段記憶,所以:

java -Xmx4G Job 

更改路徑,適當的,當然!


請注意,如果您必須經常操作這些文件,我建議您儘可能使行長度固定;治療將會更快。甚至可能使用數據庫引擎?

+0

你剛剛用炸彈殺死了一隻小螞蟻!該死的!! ':)' –

+0

@jaypal meh,如果治療需要幾個小時,你可以花幾分鐘時間寫一些自定義代碼;) – fge

+0

我不能保證正確性,但是這個努力值得讚賞。 –

1

join命令可能是你所需要的:join需要輸入文件,以便在連接字段進行排序儘管

join -o 1.3,2.3 -a 1 -e "??" <(sed 1d file1.txt | sort -k1,1) <(sed 1d file2.txt | sort -k1,1) 

將會產生,給您的樣本數據:

CGGACGTGATCACTGTGACGCCTTGCGTGTTACGGTTGTT CNCG 
TAGTATTACGACG AGGC 
TCCGAGGCCCTGTAATTGGAATGAGTAC ?? 
CCGGAGAGGGAGCCTGAGAAACGGCTACCAC ??join -o 1.3,2.3 -a 1 -e "??" <(sed 1d file1.txt | sort -k1,1) <(sed 1d file2.txt | sort -k1,1) 
TTGGAGGGC ?? 
TTGATGGTAGTATC ?? 
AATAAAACGATGCATTTATGTATTTTTGATT ?? 
TCCTCGATAGTATAGTGGTTAGTATCCCCGCC ?? 
TGATGGTAGTATC ?? 

有了這個很多數據,我認爲你最好的選擇是將數據導入關係數據庫(如sqlite),並用SQL生成報表。

+0

是的,我試了一下,它從2小時開始運行......我不知道這是否正常。我用python使用sqlite – user1845261