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