【问题标题】:Merge files where value of a column lies between values of two columns in the other file合并文件,其中一列的值位于另一个文件中两列的值之间
【发布时间】:2019-12-04 03:46:05
【问题描述】:

我有一个制表符分隔文件1

A 1 0.1 0.2
A 20 0.3 0.3
B 17 0.1 0.7
B 33 0.33 0.55
C 10 0.2 0.3
C 20 0.0 0.55
E 7 0.44 0.3

和另一个制表符分隔文件2

A 1  5 aie
A 6  20 cal
B 1  10 nan
B 30 60 ota
C 10 20 car
E 1  6 err

我想合并 col1 file1 = col1 file2 和 col2 file1 中的 value 在 file2 的 cols 2 和 3 范围内的两个文件。

输出如下:

A 1 0.1 0.2 A 1  5 aie
A 20 0.3 0.3 A 6  20 cal
B 33 0.33 0.55 B 30 60 ota
C 10 0.2 0.3 C 10 20 car
C 20 0.0 0.55 C 10 20 car

请注意,文件 1 中的某些行将与文件 2 中的同一行匹配。

我尝试了几种方法:

1)

awk 'BEGIN { FS = OFS = "\t" } FNR == NR { val[$1] = $2; d[$1] = $1 OFS $2 OFS $3 OFS $4; next }
     FNR != NR { if ($1 in val && val[$1] >= $2 && val[$1] <= $3)
print d[$1], $1, $2, $3, $4 
}' file1 file2

2)

awk 'FNR == NR {a[$1]=$2; b[$1]=$3; c[$1]= $4; next} 
                 {for(k in a) 
                      if(k+0<=$1 && $1+0<=a[k]) 
print a[k] , b[k] , c[k], $1, $2, $3, $4
}' file1 file2

【问题讨论】:

  • 上次你问这个问题 (stackoverflow.com/q/56709884/1745001) 你接受了你得到的第一个答案,这实际上阻止了其他人回答,然后你认为它对你不起作用并发布了你自己的解决方法你说也没有为你工作。所以——这次不要那样做。等待几个小时,测试你得到的答案,然后接受最适合你的答案。
  • K,会的!这个和另一个有点不同。我需要从两个文件中提取整行。我永远不知道什么是最好的……评论旧问题或发布新问题。谢谢
  • 评论一个问题的答案,直到你得到一个有效的答案,然后接受一个答案。之后,如果/当您的需求发生变化并且您无法弄清楚如何解决最新问题时,请提出有关该问题的新问题,并在有用的情况下包含对先前问题的引用。
  • 您刚刚接受了您再次得到的第一个答案 (my answer)。见my first comment above
  • 哦,呵呵。我现在明白你的意思了。 K接下来会这样做。出于某种原因,我认为代码是尽快接受答案。现在明白了。

标签: awk


【解决方案1】:
$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR==FNR {
    c = ++cnt[$1]
    beg[$1,c] = $2
    end[$1,c] = $3
    map[$1,c] = $0
    next
}
{
    for (c=1; c<=cnt[$1]; c++) {
        if ( (beg[$1,c] <= $2) && ($2 <= end[$1,c]) ) {
            print $0, map[$1,c]
        }
    }
}

$ awk -f tst.awk file2 file1
A       1       0.1     0.2     A       1       5       aie
A       20      0.3     0.3     A       6       20      cal
B       33      0.33    0.55    B       30      60      ota
C       10      0.2     0.3     C       10      20      car
C       20      0.0     0.55    C       10      20      car

【讨论】:

  • 完美。谢谢!
  • 太好了,我很高兴它对你有用,但你真的应该考虑我在你的问题下在 cmets 中给你的建议。
猜你喜欢
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2019-03-05
相关资源
最近更新 更多