比较一个文件中的列到另一个文件中的行

时间:2014-10-09 13:58:41

标签: perl awk compare

我有两个看起来像这样的文件:

文件1:

ID1 0 1
ID3 1 1
ID4 0 0

file2的:

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

我想只保留file2中的列,其ID也可以在file1中找到。
期望的输出:

ID1  ID3  ID4
 a    b    b
 x    x    y

我对awk,Perl或类似的任何提示或建议感到满意。

2 个答案:

答案 0 :(得分:1)

您可以从命令行使用perl,

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

' file2 file1

输出

ID1     ID3     ID4
a       b       b
x       x       y

答案 1 :(得分: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部分仅适用于读取file1,并记录所需的ID。
  • FNR==1仅适用于file2的第一行,它会检查是否需要每个字段,并存储一个数组p[],说明哪些字段是可打印的。
  • 最后一个序列打印出所选(可打印)字段,并在必要时添加逗号。