输出grep以包含不匹配的条目

时间:2017-06-10 10:04:21

标签: unix awk command-line grep

我正在尝试根据文件2中的匹配来映射文件1中的条目。我试过了 (grep -Ff file1 file2),join等,但它只输出匹配的条目。例如,

File1:
Cat 
Dog
Fish
Horse

File2: (tab delimited)
Cat 'Meow Meow'
Dog Bark
Horse 'Gallop gallop'
“喵喵”是一个单词。列分隔符仅为'\ t'。我期望的输出是,

Output file:
Cat Meow Meow
Dog Bark
Fish
Horse Gallop gallop

怎么做?

先谢谢,

AP

3 个答案:

答案 0 :(得分:1)

加入 命令的好例子:

join -j1 -o1.1,2.2 -t $'\t' -a1 <(sort File1) <(sort File2)

输出:

Cat     Meow Meow
Dog     Bark
Fish    
Horse    Gallop gallop
  • -o FORMAT - 在构建输出行时服从 FORMAT

  • -a FILENUM - 还会在文件 FILENUM 中打印无法使用的行,其中 FILENUM 为1或2

答案 1 :(得分:1)

awk

awk 'FNR==NR{a[$1]=$2;next} {print $1, a[$1]}' file2 file1

答案 2 :(得分:1)

Ugglyest使用Perl回答(你当时没有得到任何答案):

$ perl -e '%actions = (); open my $fh ,"<", $ARGV[0] ; while (<$fh>) { chomp ; $actions{$_} = ""; } close $fh; open $fh, "<", $ARGV[1] ; while (<$fh>) { chomp; ($animal, $action) = split /\s+/; $actions{$animal} = $action; } foreach (keys %actions) { print "$_ $actions{$_}\n"; } ; ' file1 file2
Horse Gallop
Fish 
Dog Bark
Cat Meow

更新:限制拆分。

$ perl -e '%actions = (); open my $fh ,"<", $ARGV[0] ; while (<$fh>) { chomp ; $actions{$_} = ""; } close $fh; open $fh, "<", $ARGV[1] ; while (<$fh>) { chomp; ($animal, $action) = split (/\s+/, $_, 2); $actions{$animal} = $action; } foreach (keys %actions) { print "$_ $actions{$_}\n"; } ; ' file1 file2