2017-06-10 13 views
0

ファイル2の一致に基づいてファイル1のエントリをマップしようとしています。 (grep -Ff file1 file2)を試しましたが、 。たとえば、grepが一致しないエントリを含むように出力する

File1: 
Cat 
Dog 
Fish 
Horse 

File2: (tab delimited) 
Cat 'Meow Meow' 
Dog Bark 
Horse 'Gallop gallop' 

「Meow Meow」は単一の単語です。列セパレータは '\ t'のみです。私が期待している出力は、

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

どのようにすることができますか?事前に

おかげで、

AP

答えて

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 - 出力線

  • -a FILENUMを構築しながら、FORMATに従う - もFILENUMawk有する1又は2

+0

いいです! '-o FORMATは出力行を構築しているときにFORMATに従っています:) – Aif

+0

@Aif from' man join': 'FORMATは1つまたは複数のコンマまたは空白で区切られた指定ですが、それぞれ「FILENUM.FIELD」または「0」です。 – RomanPerekhrest

+0

@RomanPerkhrest。それは動作しますが、問題は、デリミタとしてスペースが必要です。すなわち第2列に「ヤングミー」がある場合出力には、catに対応する1つのMeowを書き込みます! – Arun

1

あるファイルFILENUMから対に線を印刷:

012 Perlを使って、これまで
+0

質問が更新されました – RomanPerekhrest

1

Ugglyest答え、(あなたが一度にすべての答えが得られませんでした):

$ 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 
+0

質問が更新されました – RomanPerekhrest

関連する問題