如何从命令行中针对索引列的字典文件过滤制表符分隔的数据文件?

时间:2013-01-01 05:38:47

标签: perl sed awk grep

我的文件file1包含

123 foo
45  bar
678 foobar
...

file2包含

xyz
foo
foobar
...

我想获得一个只包含file1第二列的行的文件 出现在file2

123 foo
678 foobar
...

列由制表符分隔。我想从中运行 如果可能,请使用Mac OS X命令行。

6 个答案:

答案 0 :(得分:3)

这绝对是join的工作:

$ join -1 2 -2 1 <(sort file) <(sort file2)
foo 123
foobar 678

答案 1 :(得分:2)

使用Perl:

use strict;
use warnings;

my %seen;
open (my $input2, "<", "input2") or die("open input2: $!");
while (<$input2>) { chomp; $seen{$_}++; }
close $input2;

open (my $input1, "<", "input1") or die("open input1: $!");
while (<$input1>) {
  chomp;
  my $key = (split (/\s+/))[1];
  print "$_\n" if $seen{$key};
}
close $input1;

或者您可以使用joinsort执行此操作:

sort input2 > input2sorted
join -1 2 -2 1 input1 input2sorted

下次您可以发布问题并提出更具体的问题。

答案 2 :(得分:2)

试试这个:

grep -f file2 file1 > Output.txt

<强>文件1

123 foo
45  bar
678 foobar

file2

xyz
foo
foobar

<强> Output.txt的

123 foo
678 foobar

答案 3 :(得分:1)

这是使用awk的一种方式:

awk -F "\t" 'FNR==NR { a[$0]++; next } $2 in a' file2 file1

结果:

123 foo
678 foobar

答案 4 :(得分:0)

awk 'FNR==NR{a[$0];next}($2 in a)' file2 file1

检查herehere了解更多示例:

答案 5 :(得分:0)

这是一个使用File::Slurp来读取文件的perl选项。 map用于使用'keys'初始化散列,并且正则表达式获取grep中使用的最后一个列条目,如果条目位于散列中,则仅通过匹配的行:

use strict;
use warnings;
use File::Slurp qw/read_file/;

my %keys = map { chomp; $_ => 1 } read_file 'file2.txt';
print for grep { /\t(.+)$/; $keys{$1} } read_file 'file1.txt';

数据集的输出:

123 foo
678 foobar