10

1列とに基づいて結合/マージしようとしている 2 つのファイルがあり2ます。これらは次のようになります。( 行) は (file1行)58210よりもはるかに短く、フィールドとインデックスに基づいてこれら 2 つのファイルの共通点を見つけたいと思います。file281553012

file1:

2L      25753   33158
2L      28813   33158
2L      31003   33158
2L      31077   33161
2L      31279   33161
3L      32124   45339
3L      33256   45339
...

file2:

2L      20242   0.5     0.307692307692308
2L      22141   0.32258064516129        0.692307692307692
2L      24439   0.413793103448276       0.625
2L      24710   0.371428571428571       0.631578947368421
2L      25753   0.967741935483871       0.869565217391304
2L      28813   0.181818181818182       0.692307692307692
2L      31003   0.36    0.666666666666667
2L      31077   0.611111111111111       0.931034482758621
2L      31279   0.75    1
3L      32124   0.558823529411765       0.857142857142857
3L      33256   0.769230769230769       0.90625
...

次のいくつかのコマンドを使用してきましたが、最終的に異なる行数になります。

awk 'FNR==NR{a[$1$2]=$3;next} {if($1$2 in a) print}' file1 file2 | wc -l
awk 'FNR==NR{a[$1$2]=$3;next} {if($1$2 in a) print}' file2 file1 | wc -l

1なぜこれが起こるのかわかりません.どちらかのファイルに(列とに基づいて)行が重複している場合に備えて、比較する前に並べ替えを試みましたが2、役に立たないようです. (これがなぜそうであるかについての洞察も高く評価されます)

file2ファイルをマージして、対応する列が含ま1れている行だけが印刷され、列2が追加されて、次のようになるようにするにはどうすればよいですか。file13file1

2L      25753   0.967741935483871       0.869565217391304    33158
2L      28813   0.181818181818182       0.692307692307692    33158
2L      31003   0.36    0.666666666666667    33158
2L      31077   0.611111111111111       0.931034482758621    33161
2L      31279   0.75    1    33161
3L      32124   0.558823529411765       0.857142857142857    45339
3L      33256   0.769230769230769       0.90625    45339
4

3 に答える 3

6

ファイルを 1 行ずつ結合したい場合は、次のコマンドを使用します。

join -o 1.2,1.3,2.4,2.5,1.4 <(cat -n file1) <(cat -n file2)

質問を更新したとき:

join -o 1.1,2.2,2.3,1.2 <(sed 's/[[:space:]]\+/@/' file1|sort) \
    <(sed 's/[[:space:]]\+/@/' file2|sort)|sed 's/@/\t/'

まず、各行の最初の区切り文字をスペース以外の文字に置き換え、両方の入力ファイルを並べ替えます。次にjoin、実際の結合に使用します。出力をフィルタリングして、スペース以外の文字をスペースに置き換えます。

これは、問題のファイルからの出力です。

xyz]$ join -o 1.1,2.2,2.3,1.2 <(sed 's/[[:space:]]\+/@/' file1|sort) \
<(sed 's/[[:space:]]\+/@/' file2|sort)|sed 's/@/\t/'

2L  25753 0.967741935483871 0.869565217391304 33158
2L  28813 0.181818181818182 0.692307692307692 33158
2L  31003 0.36 0.666666666666667 33158
2L  31077 0.611111111111111 0.931034482758621 33161
2L  31279 0.75 1 33161
3L  32124 0.558823529411765 0.857142857142857 45339
3L  33256 0.769230769230769 0.90625 45339
于 2012-10-21T02:18:23.997 に答える
1

コマンドを使用できますがjoin、各データ テーブルに 1 つの結合フィールドを作成する必要があります。列 1以外の値があると仮定すると2L、このコードは、2 つの入力ファイルの並べ替え済みまたは並べ替えなしの性質に関係なく機能するはずです。

tmp=${TMPDIR:-/tmp}/tmp.$$
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15

awk '{print $1 ":" $2, $0}' file1 | sort > $tmp.1
awk '{print $1 ":" $2, $0}' file2 | sort > $tmp.2

join -o 2.2,2.3,2.4,2.5,1.4 $tmp.1 $tmp.2

rm -f $tmp.?
trap 0

「プロセス置換」がある場合bash、またはデータが既に適切にソートされていることがわかっている場合は、処理を簡素化できます。


コードが機能しなかった理由は完全にはわかりませんが、おそらくa[$1,$2]添字に使用していたでしょう。列 1 の値の一部が純粋な数値であるため、列 1 と 2 を連結するときに混乱する可能性がある場合は、問題が少なくなります。そのため、「キー作成」awkスクリプトでフィールド間にコロンを使用しました。


以下に示すように、改訂されたデータ ファイルを使用します。

ファイル1

2L      5753   33158
2L      8813   33158
2L      7885   33158
2L      7885   33159
2L      1279   33158
2L      5095   33158
2L      3256   33158
2L      5372   33158
2L      7088   33161
2L      5762   33161

ファイル2

2L      5095    0.666666666666667       1
2L      5372    0.5     0.925925925925926
2L      5762    0.434782608695652       0.580645161290323
2L      5904    0.571428571428571       0.869565217391304
2L      5974    0.434782608695652       0.694444444444444
2L      6353    0.785714285714286       0.84
2L      7088    0.590909090909091       0.733333333333333
2L      7885    0.714285714285714       0.864864864864865
2L      7902    0.642857142857143       0.810810810810811
2L      8263    0.833333333333333       0.787878787878788

(質問と変わりません。)

出力

2L 5095 0.666666666666667 1 33158
2L 5372 0.5 0.925925925925926 33158
2L 5762 0.434782608695652 0.580645161290323 33161
2L 7088 0.590909090909091 0.733333333333333 33161
2L 7885 0.714285714285714 0.864864864864865 33158
2L 7885 0.714285714285714 0.864864864864865 33159
于 2012-10-21T02:23:02.457 に答える