【问题标题】:Substituting values of one column from a list of corresponding values从对应值列表中替换一列的值
【发布时间】:2012-10-06 01:22:03
【问题描述】:

我想用 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

提前致谢!!!

【问题讨论】:

  • 请花点时间搜索 Stack Overflow。这个问题经常被问到。

标签: bash sed awk grep


【解决方案1】:

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

例如:

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

【讨论】:

    【解决方案2】:

    你可以让 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
    

    【讨论】:

      【解决方案3】:

      另一种解决方案:

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

      【讨论】:

        猜你喜欢
        • 2011-11-01
        • 2020-03-20
        • 2019-07-28
        • 1970-01-01
        • 2019-02-18
        • 2021-06-16
        • 2021-11-09
        • 2016-05-28
        • 1970-01-01
        相关资源
        最近更新 更多