如何在第2列和第3列的值略有变化的情况下合并两个文件?

时间:2014-09-28 08:18:34

标签: perl awk

我想合并两个文件,第2列和第3列的值略有不同。如果两个文件中的名称相同,则第2列或第3列的值之差为5(例如差异为5)相对于2,3列中的文件1,500-495,600-605,从文件1打印1,2,3列,从文件2打印第4列。如果file2的列与文件1不匹配,反之亦然然后打印file2的值。我的命令不起作用。如果您能帮助我的代码,我将不胜感激。感谢

$ awk 'NR==FNR {key[$1,$2,$3]=$0; next}{if (($1,$2,$3) in key) print $1,$2,$3,$4}' file1 file2

文件1

Name1 100 200 K
Name2 300 400 K
Name3 500 600 K
Name7 200 300 K

file2的

Name1 100 200 L
Name2 300 400 L
Name3 495 605 L
Name4 600 900 L

输出

Name1 100 200 K,L
Name2 300 400 K,L
Name3 500 600 K,L
Name4 600 900 L
Name7 200 300 K

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

function abs(x) { return ((x < 0.0) ? -x : x) }    
!seen[$1] {
    seen[$1] = $2 FS $3 FS $4
    next
}
{
    split(seen[$1], a)
    if (abs($2-a[1]) <= 5 && abs($3-a[2] <= 5))
        seen[$1] = seen[$1] "," $4  
}
END {
    for (i in seen) print i, seen[i]
}

之前未见过的新名称会添加到数组seen中。否则,比较第2列和第3列。我假设你的意思是不同的应该是五个或更少。您应该编辑您的问题以澄清是否是这种情况。

测试出来:

$ awk -f merge.awk file1 file2
Name1 100 200 K,L
Name2 300 400 K,L
Name3 500 600 K,L
Name4 600 900 L
Name7 200 300 K