Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell unix命令,用于筛选2个文件中的匹配数据_Shell_Unix - Fatal编程技术网

Shell unix命令,用于筛选2个文件中的匹配数据

Shell 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

情况如下:

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