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
はい
これはsed
StackExchange出力フォーマットを指定するためのものです!
$ 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