我想合并两个文件,第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
Name1 100 200 K Name2 300 400 K Name3 500 600 K Name7 200 300 K
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
答案 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