2017-02-06 1 views
0

私は2つのファイル、ファイル1持っている:私は最初の最初の3つの列に一致する値のための第二のファイルを検索しますawkスクリプトを持ってawkのVlookup:出力の最後にfile2に何かが出現するが、file1には何も出現しないようにするには?

1 800  800  0.55 
2 801  801  0.09 
3 802  802  0.88 
4 804  804  0.24 

1 800  800  0.51 
2 801  801  0.01 
3 802  802  0.01 
4 803  803  0.23 

とファイル2をファイル。

$ awk 'NR==FNR{a[$1,$2,$3];next} {if (($1,$2,$3) in a) {print $4} else {print "not found"}}' f1 f2 
0.55 
0.09 
0.88 
not found 

ファイル1に含まれていないファイル2で発生したすべての行は、まだこのような、試合後、出力の最後に追加されていること、それはそのようにする方法はあります:

0.55 
0.09 
0.88 
not found 
4 804  804  0.24 

そのように私は戻って一緒に2つのファイルを貼り付けるとき、彼らはこのようなものになります。

1 800 800 0.51 0.55 
2 801 801 0.01 0.09 
3 802 802 0.01 0.88 
4 803 803 0.23 not found 
4 804 804 not found 0.04 

または完全に異なる構文を持つ他のよりエレガントな解決策があるの?

答えて

1
awk '{k=$1FS$2FS$3}NR==FNR{a[k]=$4;next} 
     k in a{print $4;next}{print "not found";print}' f1 f2 

上記ワンライナーはあなたを与える:

0.55 
0.09 
0.88 
not found 
4 804 804 0.24 
+0

私は実際にコードに従っていません。最後の行を次のように出力する方法はありますか? 4 804 804 notfound 0.24 このようにして、0.24は5列目にあり、ファイル2の残りのデータは次のようになります。この出力がファイル1に貼り付けられ、列4に見つからない場合、この場所がファイル1に存在しないことが示されます。 "not found"を "notfound"に変更しました。それ以外の場合は、 1. – DanS

+0

を明確にするために、私がそれを貼り付けると、私の質問の最後のブロックのように見えます。 – DanS

+0

また、ファイル2にファイル1にない2つの行がある場合、各行の間に が見つかりませんでした...また、印刷する必要があるときにfile2に表示されるのと同じ順序で印刷されますそれらはファイル1と同じ順序で...(例えば、ファイル2の順序が逆になっても、同じ結果が印刷されます)アイデアは何ですか? – DanS

関連する問題