>我有包含的文件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;
或者您可以使用join
和sort
执行此操作:
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