AwkとBashを使用して、5つのフィールドに基づいてファイルを比較します。

AwkとBashを使用して、5つのフィールドに基づいてファイルを比較します。

5つのフィールド(列1、2、4、5、6)を使用してFile1とFile2(スペースで区切り)を比較したいと思います。

*論理:* File1とFile2の列1と2が正確に一致し、File2にfile1の列4と5の文字と同じ文字がある場合、file1とfile2の対応する行が連結され、出力にリダイレクトされます。

ファイル1:

s2/80   20      .       A       T       86      N=2     F=5;U=4
s2/20   10      .       G       T       90      N=2     F=5;U=4
s2/90   60      .       C       G       30      N=2     F=5;U=4

ファイル2:

s2/90   60      .       G       G       97      N=2     F=5;U=4
s2/80   20      .       A       A       20      N=2     F=5;U=4
s2/15   11      .       A       A       22      N=2     F=5;U=4
s2/90   21      .       C       C       82      N=2     F=5;U=4
s2/20   10      .       G       G       99      N=2     F=5;U=4
s2/80   10      .       T       G       11      N=2     F=5;U=4
s2/90   60      .       G       T       55      N=2     F=5;U=4

出力:

s2/80  20 . A   T   86  N=2 F=5;U=4  s2/80  20  . A   A   20   N=2     F=5;U=4
s2/20  10 . G   T   90  N=2 F=5;U=4  s2/20  10  . G   G   99   N=2     F=5;U=4
s2/90  60 . C   G   30  N=2 F=5;U=4  s2/90  60  . G   G   97   N=2     F=5;U=4

私はこの分野に初めて触れ、どんな案内にも感謝します。

ベストアンサー1

次のawkコードは、次のコードを使用するファイルですex.awk

BEGIN{}
FNR==NR{
    k=$1" "$2
    a[k]=$4" "$5
    b[k]=$0
    c[k]=$4
    d[k]=$5
    next
}

{ k=$1" "$2
  lc=c[k]
  ld=d[k]
  # file1 file2
  if ((k in a) && ($4==$5) && (lc==$4) || (ld==$5)) print b[k]" "$0
}

次に、上記の2つのファイルを使用して実行します。

$ awk -f ex.awk file1 file2

はい

これはsedStackExchange出力フォーマットを指定するためのものです!

$ awk -f ex.awk file1 file2 | sed 's/[ ]\+/  /g'
s2/90  60  .  C  G  30  N=2  F=5;U=4  s2/90  60  .  G  G  97  N=2  F=5;U=4
s2/80  20  .  A  T  86  N=2  F=5;U=4  s2/80  20  .  A  A  20  N=2  F=5;U=4
s2/20  10  .  G  T  90  N=2  F=5;U=4  s2/20  10  .  G  G  99  N=2  F=5;U=4

要件の変更

file1以下の説明では、OPは、列4と5が列4と5に一致する行を削除する最終的な解決策を望んでいると述べましたfile2

たとえば、file1&に次の行を追加しますfile2

s2/40   40      .       S       S       90      N=2     F=5;U=4

元のソリューションに1行を追加すると、要件の特定の変更が解決されます。

if ((k in a) && (lc==$4) && (ld==$5)) next

新しい例

ex2.awk:

BEGIN{}
FNR==NR{
  k=$1" "$2
  a[k]=$4" "$5
  b[k]=$0
  c[k]=$4
  d[k]=$5
  next
}

{ k=$1" "$2
  lc=c[k]
  ld=d[k]
  if ((k in a) && (lc==$4) && (ld==$5)) next
  if ((k in a) && ($4==$5) && (lc==$4) || (ld==$5)) print b[k]" "$0
}

新しいawkスクリプトを再実行してくださいex2.awk

$ awk -f ex2.awk file1 file2 | sed 's/[ ]\+/  /g'
s2/90  60  .  C  G  30  N=2  F=5;U=4  s2/90  60  .  G  G  97  N=2  F=5;U=4
s2/80  20  .  A  T  86  N=2  F=5;U=4  s2/80  20  .  A  A  20  N=2  F=5;U=4
s2/20  10  .  G  T  90  N=2  F=5;U=4  s2/20  10  .  G  G  99  N=2  F=5;U=4

おすすめ記事