有条件地切换部分线路

时间:2014-09-01 22:49:00

标签: shell unix replace sed

我的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”,但没有运气。我甚至不确定是否可以在没有临时存放更换的零件的情况下,以便能够在之后更换最后一个零件,以便切换零件。

提前致谢!

3 个答案:

答案 0 :(得分:2)

只需使用awk:

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

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

答案 1 :(得分:1)

试试这个:

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

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

答案 2 :(得分:1)

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

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