0

我想用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中的每个条目并替换为B.txtP=中的相应行值

输出:

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

提前致谢!!!

4

3 回答 3

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
于 2012-10-03T17:19:09.350 回答
1

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

例如:

join -t $'\t' -j 1 A.txt B.txt | sed 's/,P=.*,\(.*\)\t\(.*\)/,P=\2,\1/g'
于 2012-10-03T15:42:03.043 回答
0

另一种解决方案:

awk '{getline b < "B.txt" split(b, a, FS)} -F "," {sub(/beta/, a[2]); print}' A.txt
于 2012-10-05T17:22:03.657 回答