0

我有文件file1包含

123 foo
45  bar
678 foobar
...

file2包含

xyz
foo
foobar
...

我想获得一个文件,其中只有file1第二列出现在的行file2

123 foo
678 foobar
...

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

4

6 回答 6

3

这绝对是一份工作join

$ join -1 2 -2 1 <(sort file) <(sort file2)
foo 123
foobar 678
于 2013-01-01T15:04:52.160 回答
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;

或者您可以使用joinand执行此操作sort

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

此外,下次您可以发布您对该问题的看法并提出更具体的问题。

于 2013-01-01T05:52:25.520 回答
2

试试这个 :

grep -f file2 file1 > Output.txt

文件 1

123 foo
45  bar
678 foobar

文件2

xyz
foo
foobar

输出.txt

123 foo
678 foobar
于 2013-01-01T14:32:53.003 回答
1

这是一种使用方法awk

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

结果:

123 foo
678 foobar
于 2013-01-01T10:12:29.910 回答
0
awk 'FNR==NR{a[$0];next}($2 in a)' file2 file1

在此处此处查看更多示例:

于 2013-01-01T14:49:16.303 回答
0

这是一个使用File::Slurp读取文件的 perl 选项。 map用于使用“键”初始化散列,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
于 2013-01-01T17:23:45.127 回答