【问题标题】:Conditionally switch parts of line有条件地切换部分线路
【发布时间】:2014-10-26 03:32:04
【问题描述】:

我的 grepped 数据有三列。第一列的位置是静态的,而其他两列以随机顺序出现。以下方案中的 x 和 y 部分各不相同。它们的长度是恒定的。我想对数据进行管道传输并有条件地切换每行的部分,以便每行的三列相同。

现在的行:

ADDED  IDx  UPDATEDy
ADDED  UPDATEDy  IDx
ADDED  IDx  UPDATEDy
ADDED  UPDATEDy  IDx
ADDED  UPDATEDy  IDx
ADDED  IDx  UPDATEDy

我需要什么:

ADDED  IDx  UPDATEDy
ADDED  IDx  UPDATEDy
ADDED  IDx  UPDATEDy
ADDED  IDx  UPDATEDy
ADDED  IDx  UPDATEDy
ADDED  IDx  UPDATEDy

我一直在尝试编写一个 sed 表达式,如果该行包含“ADDED UPDATED”,则通过在不同索引之间复制子字符串来切换“UPDATEDy”和“IDx”,但没有运气。我什至不确定是否可以不临时存储更换的零件,以便之后能够用它替换最后一个零件,以便切换零件。

提前致谢!

【问题讨论】:

    标签: shell unix replace sed


    【解决方案1】:

    只需使用 awk:

    awk '/ADDED UPDATED/{ t=$3; $3=$2; $2=t } 1' file
    

    几乎可以肯定,您也可以摆脱之前的 grep,因为 awk 可以做 grep 可以做的任何有用的事情。

    【讨论】:

    • 非常感谢,这就是我最终使用的。
    【解决方案2】:

    你也可以使用这个 GNU sed 命令,

    sed -r '/ADDED/s/( +UPDATED\S+)( +ID\S+)/\2\1/' file
    

    【讨论】:

    • 谢谢,但不幸的是,我的示例列也无法使用它。
    【解决方案3】:

    试试这个:

    sed 's/ADDED\( \+UPDATED[^ ]\+\)\( \+ID[^ ]\+\)/ADDED\2\1/' file.txt
    

    正则表达式搜索 UPDATED 出现在 ID 之前的行,并捕获 UPDATEDx 和 IDy 部分。在这些情况下,两个捕获的组只是交换(这就是 \2\1 所做的)。
    -i 开关添加到sed 以进行就地替换。

    【讨论】:

    • 谢谢。不幸的是,我没有让这个工作。我尝试以多种方式将其应用于不同的示例行,但列没有切换。
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2018-12-15
    • 2019-07-28
    • 2018-01-06
    • 1970-01-01
    • 2021-10-15
    • 2013-02-17
    • 2017-08-27
    相关资源
    最近更新 更多