从相应值列表中替换一列的值

时间:2012-10-03 13:35:28

标签: bash sed awk grep

我想按照相应的顺序 B.txt 中的列表替换文件输入 A.txt 的一列中的条目

例如

A.txt 制表符分隔但在列中值以逗号分隔 需要更改该列值的一个条目,如P=

1 X y Z Q=Alpha,P=beta,O=Theta
2 x a b Q=Alpha,P=beta,O=Theta
3 y b c Q=Alpha,P=beta,O=Theta
4 a b c Q=Alpha,P=beta,O=Theta
5 x y z Q=Alpha,P=beta,O=Theta

B.txt

1 gamma
2 alpha
3 alpha
4 gamma
5 alpha

现在阅读 A.txt 中的每个条目,并将P=替换为 B.txt

中的相应行值

输出:

1 X y Z Q=Alpha,P=gamma,O=Theta
2 x a b Q=Alpha,P=alpha,O=Theta
3 y b c Q=Alpha,P=alpha,O=Theta
4 a b c Q=Alpha,P=gamma,O=Theta
5 x y z Q=Alpha,P=alpha,O=Theta

提前致谢!!!

3 个答案:

答案 0 :(得分:1)

假设A.txt和B.txt在第一列上排序,您可以先join这两个文件,然后使用sed在指定字段内执行替换:

例如:

join -t $'\t' -j 1 A.txt B.txt | sed 's/,P=.*,\(.*\)\t\(.*\)/,P=\2,\1/g'

答案 1 :(得分:1)

你可以让sed给你写一个sed脚本,例如:

sed 's:^:/^:; s: :\\b/s/P=[^,]+/P=:; s:$:/:' B.txt

输出:

/^1\b/s/P=[^,]+/P=gamma/
/^2\b/s/P=[^,]+/P=alpha/
/^3\b/s/P=[^,]+/P=alpha/
/^4\b/s/P=[^,]+/P=gamma/
/^5\b/s/P=[^,]+/P=alpha/

将它换成第二个sed:

sed 's:^:/^:; s: :\\b/s/P=[^,]+/P=:; s:$:/:' B.txt | sed -r -f - A.txt

输出:

1 X y Z Q=Alpha,P=gamma,O=Theta
2 x a b Q=Alpha,P=alpha,O=Theta
3 y b c Q=Alpha,P=alpha,O=Theta
4 a b c Q=Alpha,P=gamma,O=Theta
5 x y z Q=Alpha,P=alpha,O=Theta

答案 2 :(得分:0)

另一种解决方案:

awk '{getline b < "B.txt" split(b, a, FS)} -F "," {sub(/beta/, a[2]); print}' A.txt