2016-04-05 5 views
0

私はあまりにも扱いにくいとは思わないものに苦労しています。 次のコンテンツを含む複数のファイルがあります。2つのファイルからフィールドをペースト/ジョインしようとする奇妙な結果

file1の

    Model: nfb 
        Avg(logl(X)): -275.030 
        logl(Avg(X)): -252.172 
        DBar: 550.060 
        Dhat: 504.343 
        pD: 45.717 
        DIC: 595.777 

FILE2

    Model: b 
        Avg(logl(X)): -273.124 
        logl(Avg(X)): -251.069 
        DBar: 546.248 
        Dhat: 502.138 
        pD: 44.110 
        DIC: 590.358 

どちらのファイルはタブ区切りです。

   Model: nfb b 
       Avg(logl(X)): -275.030 -273.124 
       logl(Avg(X)): -252.172 -251.069 
       DBar: 550.060 546.248 
       Dhat: 504.343 502.138 
       pD: 45.717 44.110 
       DIC: 595.777 590.358 

が、すべて私のマージの試みはちょうど私が把握することはできませんいくつかの奇妙な理由で他の真上に一つのファイルから情報をコピーします。私はこのようなもので終わるように、それらをマージしようとしています。 ...ので、私はこれで終わるよ:

$ paste -d $'\t' dummie1 dummie2

   Model: Model: b 
       Avg(loglAvg(logl(X)):030-273.124 
       logl(Avglogl(Avg(X)):172-251.069 
       DBar: DBar:60 546.248 
       Dhat: Dhat:43 502.138 
       pD: pD:717 44.110 
       DIC: DIC:777 590.358 

$ awk 'FNR==NR { a[$1] = $2; next } { print $0, a[$1] }' dummie1 dummie2

私はこの

1 a b c d 
1 a b c d 
1 a b c d 
1 a b c d 
1 a b c d 

のような単純なファイルを使用する場合、コードの作業罰金の両方のセットは、だから、私は見ていないよ、データファイルについて怪しいものがあると仮定しています。

+2

あなたのファイルは、おそらくWindows上で作成されたので、各行の最後に制御-MSを持っています。削除するdos2unixを使用した後コントロールを-MSは、あなたはこれらのいずれかを行うことができます。それらを見るには 'cat -v file'を使い、それを修正するには' dos2unix'などとしてください。サンプルの入力があった場合に期待される出力を表示するために質問を編集すると、より多くのお手伝いをすることができます。 –

+0

ありがとう、@エドモートン。私はマックにいるので、 'cat file1 | col -b> newfile1'を 'dos2unix'に代わるものとして使用しています。 – user2465805

答えて

1

ファイルをソートする必要があるため、joinは使用できません。

$ paste file1 file2 | cut -f1,2,4 
Model: nfb  b 
Avg(logl(X)): -275.030  -273.124 
logl(Avg(X)): -252.172  -251.069 
DBar: 550.060 546.248 
Dhat: 504.343 502.138 
pD:  45.717 44.110 
DIC: 595.777 590.358 

$ awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[NR]=$0;next} {print a[FNR], $2}' file1 file2 
Model: nfb  b 
Avg(logl(X)): -275.030  -273.124 
logl(Avg(X)): -252.172  -251.069 
DBar: 550.060 546.248 
Dhat: 504.343 502.138 
pD:  45.717 44.110 
DIC: 595.777 590.358 
1

あなただけのファイル2から2番目の列を取得し、このようなpasteコマンドにと第二のパラメータを与えるために、プロセス置換を使用することができます

$ paste -d $'\t' file1 <(awk '{print $2}' file2) 
Model: nfb b 
Avg(logl(X)): -275.030 -273.124 
logl(Avg(X)): -252.172 -251.069 
DBar: 550.060 546.248 
Dhat: 504.343 502.138 
pD: 45.717 44.110 
DIC: 595.777 590.358 
$ 

またはすることができますあなたがしたい列を指定するだけでjoinコマンド参加

$ join -1 1 -2 1 file1 file2 
Model: nfb b 
Avg(logl(X)): -275.030 -273.124 
logl(Avg(X)): -252.172 -251.069 
DBar: 550.060 546.248 
Dhat: 504.343 502.138 
pD: 45.717 44.110 
DIC: 595.777 590.358 
$ 
+1

'-1 1 -2 1'は' -j 1'と省略することもできますし、最初のキーはデフォルトでは結合フィールドなので省略することもできます。 – karakfa

1

このjoin

するためのツールがある(-1 1 -2 1 =>はFILE1に1列目とfile2に1列目を意味します)
$ join file1 file2 

Model: nfb b 
Avg(logl(X)): -275.030 -273.124 
logl(Avg(X)): -252.172 -251.069 
DBar: 550.060 546.248 
Dhat: 504.343 502.138 
pD: 45.717 44.110 
DIC: 595.777 590.358 

他に何も必要ありません。一般的には、(多くの多くの)すべての一致するレコードを検索し、ファイルをソートする必要があります。ソート要件に関する注記タブ

$ join -t $'\t' -j 2 file1 file2 

Model:   nfb    b 
Avg(logl(X)):   -275.030    -273.124 
logl(Avg(X)):   -252.172    -251.069 
DBar:   550.060   546.248 
Dhat:   504.343   502.138 
pD:    45.717   44.110 
DIC:   595.777   590.358 

を保存するための

。ただし、この場合のように、キーを順番にマッチングしている場合(1-1のマッチング)、ファイルをソートする必要はありません。