Awk 不会将字段识别为整数值



我正在尝试根据另一个文件的两列过滤一个文件。问题在于awk没有区分,例如,这个区间70083 83083,与位置7323573(请参阅下文)。目的是检索文件 2 的第 5 列中的文件 1 的值。文件 1 在第 3 列中只有一个位置,例如:51476,文件 2 的间隔由第 3 列和第 4 列表示。最后,我需要文件 1 以及第 5 列的相应值(请参阅输出)。

文件 1

rs187298206 chr1 51476 0.0072 0.201426626822702
rs116400033 chr1 51479 0.2055 1.18445621536109
rs62637813 chr1 52058 0.0587 0.551216300225955
rs190291950 chr1 52144 -4e-04 0.036575951491895
rs150021059 chr1 52238 0.3325 1.70427928591544
rs140052487 chr1 54353 0.003 0.12778378962414
rs146477069 chr1 54421 0.1419 0.924336309646664
rs141149254 chr1 54490 0.1767 1.06786868821145
rs2462492 chr1 54676 0.0819 0.664355314594874
rs143174675 chr1 54753 0.026 0.356836206987615
rs3091274 chr1 55164 0.3548 1.80091078751368
rs10399749 chr1 55299 0.0309 0.389748348495465
rs182462964 chr1 55313 2e-04 0.0877969207975495
rs3107975 chr1 55326 0.0237 0.344080010917931
rs142800240 chr1 7323573 -6e-04 0.0361473609720785

文件 2

51083_1 chr1 51083 56000 -0.177152387075888 0.172569306719619
57083_1 chr1 57083 60083 -0.0524335467819781 0.130497858911419
60083_1 chr1 70083 83083 -0.0332555672564894 0.124932838766226
525083_1 chr1 525083 528083 0.291406335374442 0.0577249392691202
528083_1 chr1 528083 531083 0.291406335374442 0.0577249392691202
531083_1 chr1 531083 534083 0.291406335374442 0.0577249392691202
534083_1 chr1 534083 537083 0.291406335374442 0.0577249392691202
534083_1 chr1 534083 537083 0.441406335374442 0.0577249392691202

我从这个脚本中得到什么:

awk '
NR == FNR {score[$3] = $1 FS $2 FS $3 FS $4; next}
{
for (key in score)
if (key > $3 && key < $4)
print score[key], $5
}
' file1 file2 > output

输出

 rs140052487 chr1 54353 0.003 -0.177152387075888
 rs150021059 chr1 52238 0.3325 -0.177152387075888
 rs3107975 chr1 55326 0.0237 -0.177152387075888
 rs3091274 chr1 55164 0.3548 -0.177152387075888
 rs187298206 chr1 51476 0.0072 -0.177152387075888
 rs116400033 chr1 51479 0.2055 -0.177152387075888
 rs10399749 chr1 55299 0.0309 -0.177152387075888
 rs146477069 chr1 54421 0.1419 -0.177152387075888
 rs190291950 chr1 52144 -4e-04 -0.177152387075888
 rs182462964 chr1 55313 2e-04 -0.177152387075888
 rs141149254 chr1 54490 0.1767 -0.177152387075888
 rs62637813 chr1 52058 0.0587 -0.177152387075888
 rs143174675 chr1 54753 0.026 -0.177152387075888
 rs2462492 chr1 54676 0.0819 -0.177152387075888
 rs142800240 chr1 7323573 -6e-04 -0.0332555672564894 <- this should not appear
awk '     
NR == FNR {score[$3] = $1 FS $2 FS $3 FS $4; next}
{
for (key in score)
if (key+0 > $3 && key+0 < $4)
print score[key], $5
}
' fst.txt tajima.txt > output

给我

[/tmp]$ cat output
rs182462964 chr1 55313 2e-04 -0.177152387075888
rs190291950 chr1 52144 -4e-04 -0.177152387075888
rs62637813 chr1 52058 0.0587 -0.177152387075888
rs146477069 chr1 54421 0.1419 -0.177152387075888
rs140052487 chr1 54353 0.003 -0.177152387075888
rs3107975 chr1 55326 0.0237 -0.177152387075888
rs187298206 chr1 51476 0.0072 -0.177152387075888
rs141149254 chr1 54490 0.1767 -0.177152387075888
rs10399749 chr1 55299 0.0309 -0.177152387075888
rs3091274 chr1 55164 0.3548 -0.177152387075888
rs143174675 chr1 54753 0.026 -0.177152387075888
rs2462492 chr1 54676 0.0819 -0.177152387075888
rs150021059 chr1 52238 0.3325 -0.177152387075888
rs116400033 chr1 51479 0.2055 -0.177152387075888

要强制解释为数字,请向其添加 0。 来自 awk 的手册页。

我可以使用系统的 BSD awk在 Mac OS X 10.11.3 上重现您的问题。

问题与字符串与数字比较有关; awk似乎将key视为字符串,并且正在进行字符串比较而不是数字比较。

我已经暴力强迫它以数字方式处理比较:

awk '
NR == FNR {score[$3] = $1 FS $2 FS $3 FS $4; next}
{
    for (key in score)
    {
        if (key+0 > $3+0 && key+0 < $4+0)
        {
            #print "==", key, $3, $4
            #if (key > $3) print key, ">", $3
            #if (key < $4) print key, "<", $4
            print score[key], $5
        }
    }
}
' file1 file2

你可以看到"+0"迫使awk将事物视为数字。(例如,强制awk将值视为字符串的类比是 key "" ,它将空字符串连接到 key 的(字符串)值。

使用您的示例数据,然后我得到输出:

rs140052487 chr1 54353 0.003 -0.177152387075888
rs150021059 chr1 52238 0.3325 -0.177152387075888
rs3107975 chr1 55326 0.0237 -0.177152387075888
rs3091274 chr1 55164 0.3548 -0.177152387075888
rs187298206 chr1 51476 0.0072 -0.177152387075888
rs116400033 chr1 51479 0.2055 -0.177152387075888
rs10399749 chr1 55299 0.0309 -0.177152387075888
rs146477069 chr1 54421 0.1419 -0.177152387075888
rs190291950 chr1 52144 -4e-04 -0.177152387075888
rs182462964 chr1 55313 2e-04 -0.177152387075888
rs141149254 chr1 54490 0.1767 -0.177152387075888
rs62637813 chr1 52058 0.0587 -0.177152387075888
rs143174675 chr1 54753 0.026 -0.177152387075888
rs2462492 chr1 54676 0.0819 -0.177152387075888

部分调试输出(放弃了游戏)是:

== 54676 51083 56000
54676 > 51083
54676 < 56000
rs2462492 chr1 54676 0.0819 -0.177152387075888
== 7323573 70083 83083
7323573 > 70083
7323573 < 83083
rs142800240 chr1 7323573 -6e-04 -0.0332555672564894

对于 5 位字符串,比较恰好与数字比较相同。 另一方面,它没有。 我还应该指出,$3+0$4+0部分可能不是必需的。 当我显示调试输出时,我有这些 - 但是当我0添加到key时,测试才开始工作。 因此,我可能不需要将0添加到$3$4

最新更新