如何从命令行根据字典文件过滤制表符分隔的数据文件以获取索引列?



>我有包含的文件file1

123 foo
45  bar
678 foobar
...

和包含file2

xyz
foo
foobar
...

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

123 foo
678 foobar
...

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

这绝对是join的工作:

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

使用 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

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

试试这个:

grep -f file2 file1 > Output.txt

文件1

123 foo
45  bar
678 foobar

文件2

xyz
foo
foobar

输出.txt

123 foo
678 foobar

这是使用awk的一种方法:

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

结果:

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

查看此处或此处以获取更多示例:

这是一个使用 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

相关内容

  • 没有找到相关文章

最新更新