如何在Linux中用另一行替换行

如何在Linux中用另一行替换行

我有文件1:

 A1  1  NA
 A1  2  NA
 A1  3  NA
 A1  4  A
 A1  5  G
 A1  6  T
 A1  7  NA
 A1  8  NA
 A1  9  NA
 A2  1  NA
 A2  2  NA
 A2  3  T
 A2  4  NA

和文件2:

A1  4  A
A1  5  B
A1  6  T
A2  3  T

我想将文件 1 中 A2 的行号 4,5,6 和 3 替换为文件 2 中的值 4,5,6 和 3

新文件3中的预期输出:-

A1  1  NA
A1  2  NA
A1  3  NA
A1  4  A
A1  5  B
A1  6  T
A1  7  NA
A1  8  NA
A1  9  NA
A2  1  NA
A2  2  NA
A2  3  T
A2  4  NA

文件 1 对于文件 1 中第 1 列(值为 A1 到 A13)中的每个值都有 10 万行。我仅表示了示例。文件 2 仅包含文件 1 的几行,并且文件 2 的第 3 列中的值发生更改。

我想在 Linux 或 python 中尝试这个。其实答案已经有人贴出来了。答案非常好。

即使我尝试使用 awk 和 python q 命令,但我无法解决这个问题,它需要很长时间才能得到结果,并且结果文件是 0 字节。

我保留了12个小时,但仍然没有得到任何结果。

我的原始数据中的几行

文件1

 A01  1  C
 A01  2  T
 A01  3  A
 A01  4  A
 A01  5  A
 A01  6  A
 A01  7  C
 A01  8  A
 A01  9  C
 A01  10  G
 A01  11  C
 A01  12  G
 A01  13  G
 A01  14  A
 A01  15  T
 A01  16  C
 A01  17  C
 A01  18  T
 A01  19  T
 A01  20  C
 A01  21  G
 A01  22  G
 A01  23  G
 A01  24  T
 A01  25  C
 A01  26  G
 A01  27  G
 A01  28  G
 A01  29  T
 A01  30  C
 A01  31  G
  .
  .
  .
 A01 60534289  T

文件2

 A01  905  T
 A01  911  A
 A01  922  C
 A01  953  C
 A01  967  T
 A01  979  C
 A01  1046  T
 A01  1160  G
 A01  1165  T
 A01  1167  T
 A01  1171  C
 A01  1282  A
 A01  1382  T
 A01  1408  C
 A01  1743  T
 A01  1804  C
 A01  3089  G
 A01  3109  T
 A01  3243  A
 A01  3276  T
 A01  3302  T
 A01  3356  G
 A01  3373  G
 A01  3399  G
 A01  3631  C
 A01  3677  G
 A01  3682  G
 .
 .
 .
 A01  605342 B

所以在文件2中如果是T在905位置

 A01  905  T

并在文件 1 中,如果它是 B 在 905 位置

 A01  905  B

它应该将文件 1 中该特定位置的 B 替换为 T,而不改变其他位置值在假设我有 file1 的意义上改变另一个位置值

A01   10905  C 

因此,对于文件 1 中的这个位置,只有当 10905file2中是否有其他字母

答案1

我还不能在这里添加评论,所以这是我的awk解决方案这里我已经针对您的示例输入和输出进行了测试:

cat file1 file2 | awk '
    BEGIN { OFS = "  " }
    { rows[$1 OFS $2] = $3 }
    END { for (r in rows) print(r, rows[r]) }
' | sort -V >file3

您尝试过这个或发布的其他答案吗?如果你这样做了,实际输出中有哪些是你没有预料到的?如果答案不起作用,提供有关数据文件格式的附加信息可能会有所帮助。

答案2

Awk解决方案:

awk 'NR == FNR{ a[$1, $2] = $3; next }
     ($1, $2) in a{ $3 = a[$1, $2] }1' file2 OFS='  ' file1

输出:

A1  1  NA
A1  2  NA
A1  3  NA
A1  4  A
A1  5  B
A1  6  T
A1  7  NA
A1  8  NA
A1  9  NA
A2  1  NA
A2  2  NA
A2  3  T
A2  4  NA

相关内容