awk NR == FNR用于文件匹配,出了什么问题?

时间:2018-01-05 21:56:41

标签: linux unix awk

我有两个文件,我希望在第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

任何人都可以帮我理解出了什么问题吗?非常感谢!!

1 个答案:

答案 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