Shell unix命令,用于筛选2个文件中的匹配数据
情况如下: File1.csvShell unix命令,用于筛选2个文件中的匹配数据,shell,unix,Shell,Unix,情况如下: File1.csv 1,2 3,4 5,6 7,8 文件2.csv 2 4 8 然后我想读取File2.csv并将其与file1.csv的第二列进行比较,如果匹配,则获取file1的完整行并将其放入file3中 文件3 1,2 3,4 7,8 我想让unix命令执行此操作?试试看 awk -F, 'FNR==NR { a[$1]=$1 ; } NR>FNR { if ( $2 in a ) print ;}' File2.csv F
1,2
3,4
5,6
7,8
文件2.csv
2
4
8
然后我想读取File2.csv并将其与file1.csv的第二列进行比较,如果匹配,则获取file1的完整行并将其放入file3中
文件3
1,2
3,4
7,8
我想让unix命令执行此操作?试试看
awk -F, 'FNR==NR { a[$1]=$1 ; } NR>FNR { if ( $2 in a ) print ;}' File2.csv File1.csv
在哪里
FNR==NR{a[$1]=$1;}选择第一个文件File2.csv,并记住数组a中的值
NR>FNR{如果打印中有$2;}对于下一个文件,如果数组中有第二列,则打印。
可读的perl版本是:
#!/usr/bin/perl
use strict;
my %lookup;
open FILE, "File1.csv" or die "Couldn't open file: $!";
while (<FILE>){
chomp;
my ($left, $right) = split(',', $_);
$lookup{$right} = $_;
}
close FILE;
open FILE, "File2.csv" or die "Couldn't open file: $!";
open OUT_FILE, ">File3.csv" or die "Couldn't open file: $!";
while (<FILE>){
chomp;
if (exists ($lookup{$_})) {
print OUT_FILE "$lookup{$id}\n";
}
}
close FILE;
close OUT_FILE;
我知道你要求纯shell解决方案,但也许这可以让你自己改进它 您可以使用:
awk -F, 'NR==FNR {seen[$1]; next} $2 in seen' file2.csv file1.csv > file3.csv
cat file3.csv
1,2
3,4
7,8
文件3中的第1、2行从何处提交?
awk -F, 'NR==FNR {seen[$1]; next} $2 in seen' file2.csv file1.csv > file3.csv
cat file3.csv
1,2
3,4
7,8