2017-03-31 9 views
0

私と同様の質問が見つかりましたが、私の特定の問題については何も助けませんでしたそのような簡単な解決策である。)2つのファイルの列を比較し、共有項目のデータを追加し、最初のファイルの非共有項目を出力します

私は2つのファイルがあります。

FILE1:

a b c 
d e f 
g h i 

FILE2:

a b x y z 
d e x 
f h i 
0を

所望の出力:だから

a b c x y z 
d e f x 
g h i 

、私はファイル1からすべての行と列をしたいし、ファイル2の最初の2列の一致がある場合に加えて、私はそれらの列の残りの部分を追加したいです(ファイル2から)をファイル1のファイルにコピーし、新しいファイルに書き込みます。

私はawkで試してみましたが、今までは一致した行の列を追加することしかできませんでしたが、他のもの(私の例では "g、h、i"行)は表示されません。 ファイル2の項目が常に同じ量の列を持つとは限りません。

これを解決する方法はありますか?

ありがとうございました!

+0

問題を解決するために何か試しましたか? – Inian

+0

試行したソリューションを投稿し、間違ったことについてフィードバックを受け取ると、より多くのメリットが得られます。 – karakfa

答えて

0

使用以下のアプローチ:

awk 'FNR==NR{k=$1$2; $1=$2=""; a[k]=$0; next} 
    { if($1$2 in a){print $0a[$1$2] } else print $0}' file2 file1 | tr -s ' ' 

出力:

a b c x y z 
d e f x 
g h i 

FNR==NR - 最初のファイル

k=$1$2;行う保証 - kは、連想配列のための鍵でありますすべての列の値を累積します。最初の2つの列を除いて2番目のファイルから削除します(キー/ハッシュになります)。例えば、ここa['ab']='x y z'

+0

ありがとう!これを少し説明していただけますか? kはどういう意味ですか?ファイル2からの追加の後、出力は残念ながらファイル1の3番目の要素が最後に追加されます。 – User2017

+1

このメソッドには残念な副作用があるかもしれません。行は 'a ab ...'と 'aa b ...'で始まるものとします。 – karakfa

+2

キーの長さが一定であるか、タイプの異なるフィールド(たとえば、アルファが1つのアルファ、他の数字が1つのフィールド)であれば、問題は解決します。私が示唆したように別の入力ファイルを試してみてください。 – karakfa

0

は別のawk

awk  '{k=$1 FS $2} 
    NR==FNR {sub(k,"",$0); a[k]=$0; next} 
    k in a {$0 = $0 a[k]}1' file2 file1 

a b c x y z 
d e f x 
g h i 

あるよう配列がindexeedされる最初のfile2ライン用のファイルの順序に注意してください。

関連する問題