我有两个文件,我希望在第1,4,5,6列中找到匹配的行,有时可以切换5,6列,这应该是允许的。
这是两个文件的格式: 文件1
1 1:10177 0 10177 AC A
1 1:10352 0 10352 TA T
1 1:14930 0 14930 G A
1 1:15211 0 15211 T G
1 1:15274 0 15274 G A
file2的
1 1:10177:A:AC 0 10177 AC A
1 1:10235:T:TA 0 10235 TA T
1 1:10352:T:TA 0 10352 TA T
1 1:10616:CCGCCGTTGCAAAGGCGCGCCG:C 0 10616 C CCGCCGTTGCAAAGGCGCGCCG
1 1:10642:G:A 0 10642 A G
如您所见,第1,4,5和6列的行匹配。
我的awk行如下:
awk 'NR==FNR {chr[$2]=$1; pos[$2]=$4; a1[$2]=$5; a2[$2]=$6} NR>FNR && ($2 in chr) && chr[$2]==$1 && pos[$2]==$4 && (a1[$2]==$5 && a2[$2]==$6 || a1[$2]==$6 && a2[$2]==$5) {print $2}' file1 file2 > extract_results.txt
任何人都可以帮我理解出了什么问题吗?非常感谢!!
答案 0 :(得分:2)
由于您还没有显示您的预期输出,因此根据您的查询,我编写了此代码。
awk 'FNR==NR{a[$1,$4,$5,$6];b[$1,$4,$6,$5];next} (($1,$4,$5,$6) in a) || (($1,$4,$6,$5) in b) ' Input_file1 Input_file2
编辑: 根据OP的要求,我们需要将第二个字段作为输出,因此也将此代码设置如下。
awk 'FNR==NR{a[$1,$4,$5,$6];b[$1,$4,$6,$5];next} (($1,$4,$5,$6) in a) || (($1,$4,$6,$5) in b){print $2}' Input_file1 Input_file2
如果您想将输出转换为输出文件,请在上面的代码中将print $2
更改为print $2 > "output_file"
。
EDIT2: 虽然它不是高效的代码,但OP正在学习并要求修复OP的代码,所以把它放在这里。
awk 'NR==FNR {chr[$1]; pos[$4]; a1[$5]; a2[$6];next} ($1 in chr) && ($4 in pos) && ((($5 in a1) && ($6 in a2)) || (($6 in a1) && ($5 in a2))){print $2}' file1 file2