以下のように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.txt
FNR
NR
- を読み取るときは、
file2.txt
現在の行の「値」部分とその値を掛けた値がfile1.txt
ゼロか正であるかを確認します。その場合、対応する符号は同じで、「ラベル」部分はファイルに出力されますmatched
。負の数の場合、符号は同じではなく、「ラベル」部分がファイルに出力されますunmatched
。
結果:
~ > cat matched
rs151222586
~ > cat unmatched
6:66893424_T_C
rs12364336
rs57502521
ノート
- 私はそれを仮定し
+0
、-0
等号を持つと見なされます。 - また、あるファイルでは列2が0で、もう一方のファイルではゼロ以外の行がないとします。