1つの列に基づいて3つのファイルの共通行を抽出する方法はありますか?

1つの列に基づいて3つのファイルの共通行を抽出する方法はありますか?

スペースで区切られた3つのファイルがあり、約340万の行があります(ただし、行数はまったく同じではなく、「タグ」列に基づいてソートされています)。それらは次のとおりです。

  • head neu1
       Chr        BP          Marker      MAF A1 A2 Direction   pValue    N
       1 100000012 1:100000012:G:T 0.229925  T  G         + 0.650403 1594
       1 100000827 1:100000827:C:T 0.287014  T  C         + 0.955449 1594
       1 100002713 1:100002713:C:T 0.097867  T  C         - 0.290455 1594
       1 100002882 1:100002882:T:G 0.287014  G  T         + 0.955449 1594
       1 100002991 1:100002991:G:A 0.097867  A  G         - 0.290455 1594
       1 100004726 1:100004725:G:A 0.132058  A  G         + 0.115005 1594
    
  • head nep1
       Chr        BP          Marker       MAF A1 A2 Direction    pValue    N
       1 100000012 1:100000012:G:T 0.2300430  T  G         - 0.1420030 1641
       1 100000827 1:100000827:C:T 0.2867150  T  C         - 0.2045580 1641
       1 100002713 1:100002713:C:T 0.0975015  T  C         - 0.0555507 1641
       1 100002882 1:100002882:T:G 0.2867150  G  T         - 0.2045580 1641
       1 100002991 1:100002994:G:A 0.0975015  A  G         - 0.0555507 1641
       1 100004726 1:100004726:G:A 0.1325410  A  G         - 0.8725660 1641
    
  • head ret1
       Chr        BP          Marker       MAF A1 A2 Direction   pValue    N
       1 100000012 1:100000012:G:T 0.2322760  T  G         - 0.230383 1608
       1 100000827 1:100000827:C:T 0.2882460  T  C         - 0.120356 1608
       1 100002713 1:100002713:C:T 0.0982587  T  C         - 0.272936 1608
       1 100002882 1:100002883:T:G 0.2882460  G  T         - 0.120356 1608
       1 100002991 1:100002991:G:A 0.0982587  A  G         - 0.272936 1608
       1 100004726 1:100004726:G:A 0.1340170  A  G         - 0.594538 1608
    

「表示」列(3番目の列)の値が3つの元のファイルすべてに対して同じ行のみを含むneu23つのファイルをさらに生成する方法はありますか?nep2ret2

出力ファイルには、初期ファイルの9列すべてを含める必要があることに注意する必要があります。

予想される出力は次の3つのファイルです。

  • head neu2
       Chr        BP          Marker      MAF A1 A2 Direction   pValue    N
       1 100000012 1:100000012:G:T 0.229925  T  G         + 0.650403 1594
       1 100000827 1:100000827:C:T 0.287014  T  C         + 0.955449 1594
       1 100002713 1:100002713:C:T 0.097867  T  C         - 0.290455 1594
    
  • head nep1
       Chr        BP          Marker       MAF A1 A2 Direction    pValue    N
       1 100000012 1:100000012:G:T 0.2300430  T  G         - 0.1420030 1641
       1 100000827 1:100000827:C:T 0.2867150  T  C         - 0.2045580 1641
       1 100002713 1:100002713:C:T 0.0975015  T  C         - 0.0555507 1641
    
  • head ret1
       Chr        BP          Marker       MAF A1 A2 Direction   pValue    N
       1 100000012 1:100000012:G:T 0.2322760  T  G         - 0.230383 1608
       1 100000827 1:100000827:C:T 0.2882460  T  C         - 0.120356 1608
       1 100002713 1:100002713:C:T 0.0982587  T  C         - 0.272936 1608
    

3つのファイルそれぞれのヘッダーは、初期ファイルと結果ファイルにそれぞれ9つずつあります。

Chr  BP  Marker MAF  A1  A2    Direction   pValue    N

ベストアンサー1

これは迅速で効率的でなければなりません。それはjoin(の一部を使用しますGNUコアツール)とfield(の一部タンゴツール):

# This finds the matching lines and makes it into a big file with 25 columns
join -1 3 -2 3 neu1 nep1 | join -1 1 -2 3 - ret1 |
  # Now split the right columns
  # field is https://gitlab.com/ole.tange/tangetools/-/tree/master/field
  tee > >(field 2-3,1,4-9 > neu2) >(field 10-11,1,12-17 > nep2) >(field 18-19,1,20-25 > ret2)

おすすめ記事