如何用awk或sed替换两个文件?

时间:2015-11-25 19:05:40

标签: awk

我有file1:

7   8   pos
0/0 0/1 1
1/1 0/1 2
0/1 ./. 3
./. 0/1 4
0/1 0/1 5

和file2:

7   8   pos
0|0 0|1 1
1|1 1|0 2
0|1 1|0 3
1|1 1|0 4
0|1 0|1 5

我希望将file2中位于./.的{​​{1}}中file1的所有条目替换为./.

所以我会得到以下文件:

7   8   pos
0|0 0|1 1
1|1 1|0 2
0|1 ./. 3
./. 1|0 4
0|1 0|1 5

我尝试使用:

awk -F"\t" '{ for (i=1;i<=2) { if ($i=="./.") { print NR, NF } }  }' file1

获取./.的所有实例的坐标,但NF只打印字段总数,而不是匹配特定条件的字段。

尽管如此,上面的代码效率非常低,因为我必须交叉匹配这些位置然后替换。

如果有人能指导我提供更有效的解决方案,我们将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

$ cat tst.awk
BEGIN { tgt = "./." }
NR==FNR {
    for (i=1;i<=NF;i++) {
        if ($i == tgt) {
            hit[FNR,i]=1
        }
    }
    next
}
{
    for (i=1;i<=NF;i++) {
        if ( hit[FNR,i] ) {
            $i = tgt
        }
    }
    print
}

$ awk -f tst.awk file1 file2
7   8   pos
0|0 0|1 1
1|1 1|0 2
0|1 ./. 3
./. 1|0 4
0|1 0|1 5