2015-09-28 30 views
1

這個標題可能不是自我解釋,但是,我想在比較兩個文件後創建一個文件。比較兩個文件,在第二個文件中打印每個模式的出現

FILE1.TXT

GO:0016020 
GO:0043065 
GO:0003713 
GO:0007090 

FILE2.TXT

Gene1 "GO:0016020,GO:0003713" 
Gene2 "GO:0016020,GO:0003713,GO:0007090" 
Gene3 "GO:0003713" 

Output.txt的

GO:0016020 Gene1 
GO:0016020 Gene2 
GO:0003713 Gene1 
GO:0003713 Gene2 
GO:0003713 Gene3 
GO:0007090 Gene2 

基本上我想打印文件1加行的第一列,其中第一列被找到。

我試過這段代碼:

awk 'FNR==NR{a[FNR]=$1; next}{print a[FNR],$1}' File1.txt File2.txt > output.txt 

此output.txt看起來是這樣的:

GO:0016020 Gene1 
GO:0043065 Gene2 
GO:0003713 Gene3 

我只得到報道一個實例。

會有人請能夠幫助我

回答

4

使用GNU AWK 4 *真正的多維數組:

$ cat tst.awk 
BEGIN { FS="[ \"]+" } 
NR==FNR { 
    split($2,a,/,/) 
    for (i=1; i in a; i++) { 
     genes[a[i]][$1] 
    } 
    next 
} 
{ 
    if ($0 in genes) { 
     for (gene in genes[$0]) { 
      print $0, gene 
     } 
    } 
} 

$ awk -f tst.awk file2 file1 
GO:0016020 Gene1 
GO:0016020 Gene2 
GO:0003713 Gene1 
GO:0003713 Gene2 
GO:0003713 Gene3 
GO:0007090 Gene2 
+0

感謝@EdMorton解決方案。當我嘗試代碼時出現錯誤: awk:源代碼行5的語法錯誤源文件tst.awk 上下文是 \t >>>基因[a [i]] [<<< awk:源代碼中的非法聲明第5行源文件tst.awk awk:源代碼行中的非法聲明5源文件tst.awk – Rita

+0

您沒有使用GNU awk 4. *,因爲我聲明此答案是必需的。像任何其他awk一樣,你可以忽略一些有用的功能。 –

0

我知道,問題是關於awk的,但我已經開發在PHP的解決方案工作

<?php 
//Read File1.txt to a varaiable 
$file1 = file_get_contents("File1.txt"); 
//Read File2.txt to a varaiable 
$file2 = file_get_contents("File2.txt"); 
//Creates an empty array to hold the Output 
$output = array(); 

//matches all genes on File1.txt 
preg_match_all('/GO:\d+/i', $file1, $matches, PREG_PATTERN_ORDER); 

//Loop results of genes on File1.txt 
foreach($matches[0] as $gene){ 
    //match gene number for this specific gene in File2 
    preg_match_all("/(Gene\d+).*?$gene/i", $file2, $matches2, PREG_PATTERN_ORDER); 
    //Loop matches of File2.txt 
for ($i = 0; $i < count($matches2[1]); $i++) { 
    //add to array output 
    array_push($output, $gene." ".$matches2[1][$i]); 
} 
} 

//unique genes 
$output = array_unique($output); 
//output the unique genes to Output.txt 
foreach($output as $sortedGene){ 
    file_put_contents('Output.txt',$sortedGene."\n", FILE_APPEND); 
} 
/* 
GO:0016020 Gene1 
GO:0016020 Gene2 
GO:0003713 Gene1 
GO:0003713 Gene2 
GO:0003713 Gene3 
GO:0007090 Gene2 
*/ 
1

或者你可以使用Unix「加入」,經過一些操縱。加入還需要排序的文件:

sort file1.txt > file1.sort.txt 
cat file2.txt|tr -d \"|tr , " "|awk '{for(i=2;i<=NF;++i)print $i,$1}'|sort|join - file1.sort.txt 
3

替代awk沒有多維數組

$ awk 'NR==FNR{a[$2]=$1;next} {for(r in a) if(r~$1) print $1,a[r]}' file2 file1 
GO:0016020 Gene2 
GO:0016020 Gene1 
GO:0003713 Gene2 
GO:0003713 Gene1 
GO:0003713 Gene3 
GO:0007090 Gene2 
+0

好主意,只要'GO:whatever'字符串的長度與它們在樣本中的長度完全相同即可。 +1 –

+0

我不認爲長度是相關的,但他們應該有一個共同的前綴,這是不重複的內容。 「去:」將確保。 – karakfa

+0

長度是相關的,因爲如果在一個文件中存在'GO:001602',那麼它將匹配另一個文件中的'GO:001602 [0-9] *'。 –

相關問題