2014-09-01 64 views
1

我的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表达式,如果行包含 “补充更新的”,切换“UPDATEDy “与”IDx“通过在不同索引之间复制子字符串,但没有运气。我甚至不确定是否可以暂时存储替换的零件,以便能够随后更换最后一个零件,以便切换零件。

提前致谢!

回答

2

只需使用AWK:

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

你几乎可以肯定干掉你前面的grep也为AWK可以做任何有用的grep的可以做。

+1

非常感谢,这是我最终使用的。 – Johe 2014-09-03 07:15:30

1

尝试这一个:

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

对于其中修订版ID之前出现,并捕获两UPDATEDx以及所述IDY部分线正则表达式搜索。在这些情况下,两个捕获的组只是交换(这是\2\1所做的)。
添加-i切换到sed来替换原地。

+0

谢谢。不幸的是,我没有得到这个工作。我试着用不同的示例行以几种方式应用它,但列没有切换。 – Johe 2014-09-03 07:19:04

1

您可以使用此GNU sed的命令也,

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

谢谢,但不幸的是,我没有得到这个与我的示例列一起工作。 – Johe 2014-09-03 07:23:23