2016-03-01 48 views
0

我想要使用file1(它只是一個唯一的ID列表)過濾file2中的特定字段($7)。下面的awk運行,但不過濾文件(它保持不變)。謝謝 :)。awk過濾另一個特定字段的文件

file1的

ACTA2 
ACTC1 
AGRN 

file2的

Chr Start End Ref Alt Func.refGene Gene.refGene GeneDetail.refGene 
chr1 977330 977330 T C intronic AGRN 0 
chr1 981931 981931 A G exonic AGRN 0 
chr1 982994 982994 T C exonic AGRN 0 
chr1 1269554 1269554 T C exonic TAS1R3 0 
chr1 1647778 1647778 C G intronic CDK11A CDK11B 
chr1 1647814 1647814 T C exonic CDK11A CDK11B 

期望的輸出

Chr Start End Ref Alt Func.refGene Gene.refGene GeneDetail.refGene 
chr1 977330 977330 T C intronic AGRN 0 
chr1 981931 981931 A G exonic AGRN 0 
chr1 982994 982994 T C exonic AGRN 0 

AWK

awk 'NR==FNR{for (i=1;i<=NF;i++) a[$i];next} !($7 in a)' file1 FS="[ =]" file2 > output.txt 

a[$i]是用來放所有項目file1中到用於確保僅file1的使用陣列aNR==FNR。在第二部分中,將FS設置爲空格或"=",然後比較$7中的file2是否在此數組中,如果是,則打印它。

+1

非常感謝你:)。我以爲我需要循環通過file1迭代,但我現在看到我不是正確的,再次感謝:)。 – Chris

回答

2

只是刪除file1和file2中FS="[ =]"FNR==1 ||

$ awk 'NR==FNR{for (i=1;i<=NF;i++) a[$i];next} FNR==1 || ($7 in a)' file1 file2 

Chr Start End Ref Alt Func.refGene Gene.refGene GeneDetail.refGene 
chr1 977330 977330 T C intronic AGRN 0 
chr1 981931 981931 A G exonic AGRN 0 
chr1 982994 982994 T C exonic AGRN 0 
當然

取代!你不需要在for循環

$ awk 'NR==FNR{a[$1];next} FNR==1 || ($7 in a)' file1 file2 
-1

你不需要使用awk你可以用grep

grep -f file1.txt file2.txt 

那麼你可以寫一個簡單的bash腳本

#!/bin/bash 
head -1 file2.txt 
grep -f file1.txt file2.txt 

輸出

Chr Start End Ref Alt Func.refGene Gene.refGene GeneDetail.refGene 
chr1 977330 977330 T C intronic AGRN 0 
chr1 981931 981931 A G exonic AGRN 0 
chr1 982994 982994 T C exonic AGRN 0 
+2

這不會限制比賽只有一個領域。 – karakfa

+1

也不會將其限制爲整個字段,它將執行部分匹配,因此如果'file1'包含'AGRN1'且file2包含'AGRN12'則它將被視爲匹配。如果它包含與file1中任何內容的部分匹配,它也會複製標題行。 –

+1

你們都是對的,我不認爲它 – ClaudioM