2014-10-09 51 views
0

排隊我有兩個文件,這是這個樣子:從一個文件比較列在另一個

文件1:

ID1 0 1 
ID3 1 1 
ID4 0 0 

文件2:

ID1 ID2 ID3 ID4 ID5 
a a b b a 
x y x y y 

我只想保持file2中的列也可以在file1中找到。
所需的輸出:

ID1 ID3 ID4 
a b b 
x x y 

我很高興在AWK,Perl或類似的任何提示或建議。

回答

1

您可以使用命令行的perl,

perl -lane' 
    BEGIN{ local @ARGV = pop; @h{ map /(\w+)/, <> } =() } 
    @r = grep exists $h{$F[$_]}, 0 .. $#F if [email protected]; 
    print join "\t", @F[@r]; 

' file2 file1 

輸出

ID1  ID3  ID4 
a  b  b 
x  x  y 
+1

當我在我的文件上試試這個時,它返回一堆0。我可以嘗試自己調試代碼,但我覺得它有點神祕。你能解釋一下你如何製作地圖嗎? – codegirl 2014-10-09 15:13:00

+1

@codegirl音符文件順序,file1排在第二位。 – 2014-10-09 16:16:28

+1

@codegirl'map'將file1中的ID讀入散列'%h'中。下一行獲取file2中具有也在file1中的ID的列的索引;索引存儲在數組「@ r」中。最後一行只是打印所需的列。神祕,我同意(單行者傾向於)。 – ThisSuitIsBlackNot 2014-10-09 16:32:15

1

,如果你是幸福的awk你可以這樣做:

awk 'FNR==NR {ok[$1]++;next} 
    FNR==1 {for(f=1;f<NF;f++)if(ok[$f])p[f]++} 
       {for(x=1;x<NF;x++)if(p[x]){{if(length(out)>0)out=out ","}out=out $x;}print out;out=""}' file1 file2 
  • FNR=NR部分僅適用於f的閱讀ile1並記錄所需的ID。
  • FNR==1僅適用於file2的第一行,它檢查是否需要每個字段並存儲指示哪些字段可打印的數組p[]
  • 最後一個序列打印出所選(可打印)字段,並在必要時添加逗號。