如何在vi shell中为每个匹配项交换两个固定列值?

时间:2014-02-07 11:49:05

标签: shell unix vi

我有一个包含以下格式数据的文件: cat file1

a b c d e
e f g h i
p q r s t

我希望输出格式如下:

a c b d e
e g f h i
p r q s t 

在vi或shell中交换两列的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

awk为例:

$ awk '{a=$2; $2=$3; $3=a}1' file
a c b d e
e g f h i
p r q s t

您可以通过以下方式使其更加通用:

$ awk -v c1=FIRST_COL -v c2=SECOND_COL '{a=$c1; $c1=$c2; $c2=a}1' file

例如:

$ awk -v c1=2 -v c2=3 '{a=$c1; $c1=$c2; $c2=a}1' file
a b d c e
e f h g i
p q s r t

要在vi内使用它,请在命令前使用以下命令:

:%!

这样执行的完整命令是:

:%!awk '{a=$2; $2=$3; $3=a}1'

答案 1 :(得分:1)

在vi中你可以执行以下命令:

:%!awk '{c3=$3; $3=$2; $2=c3} 1'