特定の列の値に同じ符号(-または+)を持つ2つのファイルの行をフィルタリングする方法は?

特定の列の値に同じ符号(-または+)を持つ2つのファイルの行をフィルタリングする方法は?

以下のように2つのファイルがあります。

  • file1:
    6:66893424_T_C -0.5985 
    rs151222586 -0.0351 
    rs12364336 -0.0030 
    rs57502521 0.0099 
    
  • file2:
    6:66893424_T_C 0.5985
    rs151222586 -0.0351
    rs12364336 0.003
    rs57502521 -0.0099
    

私の考えでは:

  • 列2で同じ記号(マイナス記号またはプラス記号)を持つ行を検索する
  • シンボルマッチングのために列 1 項目のリストを作成します。
  • 一致する項目がない列1項目のリストを作成します。

私の考えでは:

  • 一致する出力は
    rs151222586
    
  • そして比類のない出力
    6:66893424_T_C
    rs12364336
    rs57502521
    

答え1

2番目のフィールドを4番目のフィールドと比較できるように、+awkファイルを並べて貼り付けます。

paste file1 file2 |
awk '
  $2&&$4 {
    print $1 > ($2*$4>0?"match":"unmatch")
  }
'

結果はファイルの一致と不一致です。

答え2

複数の入力ファイルを処理するのは簡単で、データを単一のファイルに縮小すると簡単になります。pasteたとえば、次のようjoinにできます。

$ paste file1 file2
6:66893424_T_C -0.5985  6:66893424_T_C 0.5985
rs151222586 -0.0351     rs151222586 -0.0351
rs12364336 -0.0030      rs12364336 0.003
rs57502521 0.0099       rs57502521 -0.0099

$ join -j1 file1 file2
6:66893424_T_C -0.5985  0.5985
rs151222586 -0.0351  -0.0351
rs12364336 -0.0030  0.003
rs57502521 0.0099  -0.0099

前者は正しい順序を得ることに依存する。どちらの場合も、ファイルが互いに一致しないことを確認する必要があります。

paste異なる記号で署名された項目を使用した出力:

$ paste file1 file2 | awk '($2 >= 0) != ($4 >= 0) {print $1}'
6:66893424_T_C
rs12364336
rs57502521

>=計算結果は、1または0なので、!=同様の方法を使用して比較結果を比較します。私はランダムにゼロを正数にソートすることにしました。==等号にも同様に使用されます。

また、シンボリック関数を明示的に定義することもできます。

$ paste file1 file2 | awk 'function sign(x) { return x >= 0 ? +1 : -1; }
                           sign($2) != sign($4) {print $1}'
6:66893424_T_C
rs12364336
rs57502521

答え3

両方のファイルに対して1行ずつ操作を実行できないため、awk一定量のバッファリングが必要です。ファイルが十分に小さい場合は機能します。

awk 'NR==FNR{v[$1]=$2; next}
     {if ($2*v[$1]>=0) {print $1 > "matched"} else {print $1 > "unmatched"}}' file1.txt file2.txt
  • を読み取ると、file1.txt「ラベル」と「値」のペアのみが配列に書き込まれ、v実行は次の入力行にジャンプします。各ファイルラインカウンタがグローバルラインカウンタと同じであることを確認して、処理中かどうかを区別しますfile1.txt。同じ場合は、最初のファイルを処理しています。file2.txtFNRNR
  • を読み取るときは、file2.txt現在の行の「値」部分とその値を掛けた値がfile1.txtゼロか正であるかを確認します。その場合、対応する符号は同じで、「ラベル」部分はファイルに出力されますmatched。負の数の場合、符号は同じではなく、「ラベル」部分がファイルに出力されますunmatched

結果:

~ > cat matched 
rs151222586

~ > cat unmatched
6:66893424_T_C
rs12364336
rs57502521

ノート

  • 私はそれを仮定し+0-0等号を持つと見なされます。
  • また、あるファイルでは列2が0で、もう一方のファイルではゼロ以外の行がないとします。

関連情報