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