1

私はこの質問のアドバイスを使用してきました: bash (Linux) で 1 つの csv から別の csv (vlookup など) の値を見つける

複数のデータ ファイルを調べて、vlookup スタイルの方法で他の (1 つの) 参照ファイルから列を追加するスクリプトを作成してみます。

データファイルの例 (*.data)

info1   7   44567    1   2  marker1
info2   3   143679   2   2  marker2

参照ファイルの例 (ref.txt、参照元のファイル)

marker1     66%
marker2     34%

2 番目の参照ファイルの例 (ref2.txt、参照する 2 番目のファイル)

info1 正確
info2 部分的

出力が必要

info1   7   44567    1   2  marker1   66%   exact
info2   3   143679   2   2  marker2   34%   partial

試行されたループ (参照ファイルを 1 つだけ表示します。まだそのビットが機能していないためです!)

#!/bin/bash
for file in `ls /path/*.data`; 
do
for i in $file; 
do 
KEY=$(cut -f 6 $file);
    printf "%s\t" $i;
    grep "${KEY}" /path/ref1.txt | cut -f 2 ; 
done
done

私が書いたスクリプトには 2 つの問題があると思います。出力は現在、入力ファイルのすべての行が追加されるのではなく、入力ファイルごとに 1 行であり、ファイル内の行ではなくファイルのファイル名です。ただし、参照ビットは機能しているようです(1行の出力でわかることから)。つまり:

/path/1.data    66%

何がうまくいかないのか、またはこれを行うためのより賢い方法を提案してください。どうもありがとう。

4

1 に答える 1

2

これにはjoinユーティリティがあります。特に、あなたの例を考えると:

join -o 1.1,1.1,1.3,1.4,1.5,1.6,2.2 -1 6 -2 1 test.data ref.txt |
  join -o 1.1,1.1,1.3,1.4,1.5,1.6,1.7,2.2 -j 1 - ref2.txt

これにより、提案された出力が生成されます。この-o <list>オプションは、フォーマットで印刷する各フィールドを指定します<filenumber>.<fieldnumber>。一致させたい各ファイルのフィールドをそれぞれ指定し-1 <n>ます。フィールド番号が両方のファイルで同じ場合に使用できるショートカットです。-2 <n>-j <n>

于 2013-02-27T21:46:18.357 に答える