4つのフィールドを使用してawkとUNIXを使用して2つのファイルで共通行を検索する

4つのフィールドを使用してawkとUNIXを使用して2つのファイルで共通行を検索する

2つのファイルがあります。 file1とfile2のフィールド1、2、4、5の両方が一致する場合は、出力ファイルにfile1とfile2の行全体を印刷したいと思います。

ファイル1:

sc2/80         20      .        A       T         86   F=5;U=4
sc2/60         55      .        G       T         76   F=5;U=4 
sc2/68         20      .        T       C         71   F=5;U=4
sc2/24         24      .        T       G         31   F=5;U=4

ファイル2:

sc2/99         84      .        C       G         61   F=5;U=4
sc2/80         20      .        A       T         30   F=5;U=4
sc2/60         40      .        G       T         76   F=5;U=4 
sc2/30         20      .        T       C         71   F=5;U=4
sc2/24         24      .        T       G         91   F=5;U=4

予想出力:

sc2/80         20      .        A       T         86       F=5;U=4
sc2/80         20      .        A       T         30       F=5;U=4
sc2/24         24      .        T       G         31       F=5;U=4
sc2/24         24      .        T       G         91       F=5;U=4

私はこの分野に初めてアクセスし、助けてくれてありがとう。

答え1

多次元配列を使用できます。

awk 'FNR==NR{a[$1,$2,$4,$5]=$0;next}{if(b=a[$1,$2,$4,$5]){print b;print}}' file1 file2

FNRNR(ファイルレコード数)は、awkが最初のファイルを処理したときの値と同じです。

a[$1,$2]=$0a[$1 SUBSEP $2]=$0or と同じでa[$1"\034"$2]=$0($1,$2)in aor と同じです。($1 SUBSEP $2)in a($1"\034"$2)in a

のように.ifif(b=a[$1,$2,$4,$5]){print b;print}に置き換えることもできます。if(($1,$2,$4,$5)in a){print a[$1,$2,$4,$5];print}!("index" in a)a["index"]a["index"]=""

答え2

あなたがPerlやPythonソリューションを望んでいないと言ったことを知っていますが、他の人には役に立つかもしれません(生物情報学をしている場合は、実際にこれらの言語の1つを学ぶ必要があります)。

perl -ane '$f=$F[0].$F[1]; print "$k{$f}$_" if $k{$f}; $k{$f}=$_;' file1 file2 

説明する:

この-aオプションを使用すると、Perlは入力を配列@Fに分割します。-nつまり、入力ファイルを1行ずつ読み込むという意味です。-eつまり、「コマンドラインで提供したスクリプトを実行します」という意味です。

したがって、最初の()フィールドと2番目の()フィールドを連結したものに設定されます$f。現在の行()をキーで呼び出されるハッシュ(Perlの連想配列)に値として格納することを示します。ファイルを読み取るときに現在の行と値がある場合は印刷します。つまり、同じ2つの最初のフィールドを持つ行を見た場合は、その行と現在の行を印刷します。$F[0]$F[1]$k{$f}=$_$_k$f$k{$f}

答え3

両方のファイルの順序を変更せずに交差点を印刷しますか(したがって交差点が設定されていません)。見上げるよ文字列類似性アルゴリズム各行を文字として扱います。どの文字(行)が同じであるかを追跡するには、アルゴリズムを変更する必要があります。最大の問題は、順序は重要ですが、場所は重要ではないということです。また、興味のないフィールドを削除するようにデータを書き換えることで、データを管理しやすくなります。 (またはこれらのフィールドを無視する比較関数を作成します。)

PythonやPerlを考えてみましたか?生物情報学分野で人気が高いと聞きました。これは実際にプログラミング作業のように見えます。

答え4

各ファイルに固有のエントリがあることを保証できる場合。ファイルをリンクしてファイルを並べ替えますsort -u。並べ替え-u て重複したアイテムを検索してください。

この小さなスクリプトを書くことはできますが、私の考えではできません。しかし、私のアプローチを考えると、これは難しくありません。


今私の前にコンソールがありました。ここにあります:

rm -rf all; sort -u file1 > all; sort -u file2 >> all
sort all | uniq --all-repeated=separate -w 32

すでにソートされていて重複した項目がない場合は、file1 file2次のコマンドを使用できます。

sort -m file1 file2 | uniq --all-repeated=separate -w 32

あ、全体の行を比較してみると正確におっしゃった内容ではないようですね。たぶん他の誰かがこれが役に立つと思うかもしれません。

関連情報