Bash 从对应值列表中替换一列的值

Bash 从对应值列表中替换一列的值,bash,sed,awk,grep,Bash,Sed,Awk,Grep,我想用B.txt中给出的列表以相应的顺序替换文件input 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是

我想用B.txt中给出的列表以相应的顺序替换文件input 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是

现在读取A.txt中的每个条目,并用B.txt中相应的行值替换
p=

输出:

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
/^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/
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

提前感谢

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

例如:

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

您可以让sed为您编写sed脚本,例如:

sed 's:^:/^:; s: :\\b/s/P=[^,]+/P=:; s:$:/:' 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
/^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/
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
将其导入第二个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
/^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/
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
另一个解决方案:

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

请花点时间搜索堆栈溢出。这个问题经常被问到。