異なるファイルの2つの列の間で一致するものを見つけて、異なる列に印刷する

異なるファイルの2つの列の間で一致するものを見つけて、異なる列に印刷する

file12列と6列の間に一致する項目があるかどうかを確認する方法を見つけようとしていますfile2。その場合は、14列の対応する文字列と一致するものを印刷してfile2別のファイルに保存したいと思いますfile3

ファイル1:

  1 ENSCAFT00000037911
  1 ENSCAFT00000046425
  1 ENSC
  1 ENSCAFT00000009252
  1 ENSCAFT00000049028
  1 ENSC
  2 AFT00000000014
  2 ENSCAFT00000042968
  2 ENSCAFT000000

ファイル2:

   1 13336837 13358107 -1 SERPINB7 AFT00000000014 ENSCAFG00000023436 34.51 13.70 16.30 7.80 18.85 10.21 0.50 
   1 14028702 14130819 -1 PHLPP1 ENSCAFT00000000123 ENSCAFG00000000070 1531.81 1090.63 518.08 559.90 581.70 1126.21 0.41 
   1 14702158 14789303 1 PIGN ENSCAFT00000000137 ENSCAFG00000000083 979.07 882.88 296.70 272.97 369.74 877.13 0.31 
   1 17154193 17210961 -1 ZNF532 ENSCAFT00000049028 ENSCAFG00000000103 31.62 58.98 13.83 23.80 27.50 15.38 0.42 
   1 17154246 17210961 -1 NA ENSCAFT00000000164 ENSCAFG00000000103 31.62 58.98 13.83 23.80 27.50 15.38 0.42 
   1 17491358 17563171 1 ALPK2 ENSCAFT00000000169 ENSCAFG00000000107 12.18 10.55 39.99 31.41 210.85 15.82 3.14 
   1 18214832 18277601 1 ATP8B1 ENSCAFT00000000203 ENSCAFG00000000123 751.98 827.35 373.91 394.89 571.98 711.16 0.49 

希望の出力:

    ENSCAFT00000049028 0.42
    AFT00000000014 0.50 

順序は重要ではありません。

ベストアンサー1

シンプルjoin

join -1 2 -2 6 -o 1.2,2.14 <(sort -k2 file1) <(sort -k6 file2 )
  • -1 2定義file1フィールド2は接続フィールドである。
  • -2 6定義file2フィールド6は接続フィールドである。
  • -o 1.2,2.14出力フォーマットfile1フィールド2の後にfile2フィールド14が続きます。
  • <(sort ...)-kこれがjoin正しく機能するためには、両方のファイルが結合フィールドでソートされている必要があります。

または、以下を使用しますawk(ソートされた入力は不要です)。

awk 'FNR==NR{a[$2]=$0} FNR!=NR&&a[$6]{print $6,$14}' file1 file2
  • FNR==NR最初のファイルの場合 file1:
    • a[$2]=$0a2番目のフィールドを$2インデックスとして使用して配列を埋めます。
  • FNR!=NR2番目のファイルの場合file2
  • a[$6]$66番目のフィールドが配列に存在する場合a
    • print $6,$142つの値を印刷します。

おすすめ記事