![如何在Linux中用另一行替换行](https://linux22.com/image/130399/%E5%A6%82%E4%BD%95%E5%9C%A8Linux%E4%B8%AD%E7%94%A8%E5%8F%A6%E4%B8%80%E8%A1%8C%E6%9B%BF%E6%8D%A2%E8%A1%8C.png)
我有文件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