Bash 使用带多个参数的AWK比较2个文件

Bash 使用带多个参数的AWK比较2个文件,bash,awk,Bash,Awk,使用awk比较两个文本文件时出现问题。这是我想做的 File1在第一列中包含一个名称,该名称必须与file2的第一列中的名称匹配。这很容易,到目前为止还不错。如果匹配,我需要检查file1第2列中的数字是否在file2第2列和第3列的数字范围内(参见示例)。如果是这种情况,则将两个匹配行作为一行打印到新文件中。我用awk写了一些东西,它给了我一个正确的作业输出,但它忽略了大部分。我是否缺少某种循环函数?这两个文件都根据第一列进行排序 文件1: 文件2: 输出: 我的awk尝试: awk-F“\t

使用awk比较两个文本文件时出现问题。这是我想做的

File1在第一列中包含一个名称,该名称必须与file2的第一列中的名称匹配。这很容易,到目前为止还不错。如果匹配,我需要检查file1第2列中的数字是否在file2第2列和第3列的数字范围内(参见示例)。如果是这种情况,则将两个匹配行作为一行打印到新文件中。我用awk写了一些东西,它给了我一个正确的作业输出,但它忽略了大部分。我是否缺少某种循环函数?这两个文件都根据第一列进行排序

文件1: 文件2: 输出: 我的awk尝试:
awk-F“\t”'FNR==NR{b[$1]=$0;c[$1]=$1;d[$1]=$2;e[$1]=$3;next}对于{if(c[$1]=$1&&d[$1]=$2){print b[$1]“\t“$0}”File1 File2>out.txt

如何使用awk获得所需的输出?欢迎提供任何建议…

使用
join
对两个文件进行数据库式连接,然后使用AWK筛选出不正确的匹配项:

$ join file1 file2 | awk '$2 >= $7 && $2 <= $8'
scaffold10| 456 T A 1.0000 0.0000 400 550
scaffold10| 470 C A 0.9906 0.0000 400 550
scaffold56| 5 A C 0.8423 0.0000 3 5000
scaffold56| 1000 C T 0.8423 0.0000 3 5000
scaffold9| 300 T T 0.9034 0.0000 234 675
scaffold9| 10900 T G 0.9044 0.0000 10887 11000

$join file1 file2 | awk'$2>=$7&&$2=$7&&$2一种awk解决方案,它将第一个文件读入一个数组,然后动态将其与第二个文件的内容进行比较

awk 'NR==FNR{i++; x[i]=$0; x_1[i]=$2; x_2[i]=$3 }
     NR!=FNR{ for(j=1;j<=i;j++){
                if( $1~x[j] && x_1[j]<$2 && x_2[j]>$2 ){
                  print $0,x[j]
                }
              }
}' file2 file1

# scaffold10|   456   T   A   1.0000   0.0000 scaffold10|   400   550   
# scaffold10|   470   C   A   0.9906   0.0000 scaffold10|   400   550   
# scaffold56|   5     A   C   0.8423   0.0000 scaffold56|   3     5000  
# scaffold56|   1000  C   T   0.8423   0.0000 scaffold56|   3     5000  
# scaffold9|    300   T   T   0.9034   0.0000 scaffold9|    234   675  
# scaffold9|    10900 T   G   0.9044   0.0000 scaffold9|    10887 11000
awk'NR==FNR{i++;x[i]=0;x_1[i]=2;x_2[i]=3}

NR=FNR{for(j=1;j该awk脚本有语法错误。
在那里无效。也就是说,您在作业中错误地折叠了
文件1
中的多行。您键入了
b
c
d
e
表,但该字段跨行重复,因此您将只存储给定值的最后一行。根据您的要求,我想您可能会发现以另一种方式对文件进行操作更容易。也就是说,首先捕获范围,然后将
File1
中的行与您看到的行进行比较。感谢Etan指出我的错误。非常感谢您oss。它成功了。你帮了我很多!!一个非常聪明的解决方案=)
scaffold10|  456   T   A   1.0000   0.0000   scaffold10|  400   550
scaffold10|  470   C   A   0.9906   0.0000   scaffold10|  400   550
scaffold56|  5     A   C   0.8423   0.0000   scaffold56|  3     5000
scaffold56|  1000  C   T   0.8423   0.0000   scaffold56|  3     5000
scaffold9|   300   T   T   0.9034   0.0000   scaffold9|   234   675 
scaffold9|   10900 T   G   0.9044   0.0000   scaffold9|   10887 11000 
awk -F "\t" ' FNR==NR {b[$1]=$0; c[$1]=$1; d[$1]=$2; e[$1]=$3; next} for {if (c[$1]==$1 && d[$1]<=$2 && e[$1]>=$2) {print b[$1]"\t"$0}}' File1 File2 > out.txt
$ join file1 file2 | awk '$2 >= $7 && $2 <= $8'
scaffold10| 456 T A 1.0000 0.0000 400 550
scaffold10| 470 C A 0.9906 0.0000 400 550
scaffold56| 5 A C 0.8423 0.0000 3 5000
scaffold56| 1000 C T 0.8423 0.0000 3 5000
scaffold9| 300 T T 0.9034 0.0000 234 675
scaffold9| 10900 T G 0.9044 0.0000 10887 11000
$ join file1 file2 | awk '$2 >= $7 && $2 <= $8 { printf("%-12s %-5s %-3s %-3s %-8s %-8s %-12s %-5s %-5s\n", $1, $2, $3, $4, $5, $6, $1, $7, $8); }'
scaffold10|  456   T   A   1.0000   0.0000   scaffold10|  400   550
scaffold10|  470   C   A   0.9906   0.0000   scaffold10|  400   550
scaffold56|  5     A   C   0.8423   0.0000   scaffold56|  3     5000
scaffold56|  1000  C   T   0.8423   0.0000   scaffold56|  3     5000
scaffold9|   300   T   T   0.9034   0.0000   scaffold9|   234   675
scaffold9|   10900 T   G   0.9044   0.0000   scaffold9|   10887 11000
awk 'NR==FNR{i++; x[i]=$0; x_1[i]=$2; x_2[i]=$3 }
     NR!=FNR{ for(j=1;j<=i;j++){
                if( $1~x[j] && x_1[j]<$2 && x_2[j]>$2 ){
                  print $0,x[j]
                }
              }
}' file2 file1

# scaffold10|   456   T   A   1.0000   0.0000 scaffold10|   400   550   
# scaffold10|   470   C   A   0.9906   0.0000 scaffold10|   400   550   
# scaffold56|   5     A   C   0.8423   0.0000 scaffold56|   3     5000  
# scaffold56|   1000  C   T   0.8423   0.0000 scaffold56|   3     5000  
# scaffold9|    300   T   T   0.9034   0.0000 scaffold9|    234   675  
# scaffold9|    10900 T   G   0.9044   0.0000 scaffold9|    10887 11000