如何为vi shell中的每个引用交换两个固定列值?

如何为vi shell中的每个引用交换两个固定列值?,shell,unix,vi,Shell,Unix,Vi,我有一个包含以下格式数据的文件: cat文件1 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中交换两列的最佳方法是什么?使用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=2 -v c2=3 '{a=$c1; $c1=$c2; $c2=a}1' file

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

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中交换两列的最佳方法是什么?

使用
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=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
您可以通过以下方法使其更通用:

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

$ 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=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'

在vi中,您可以执行以下命令:

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

对不起,可能是重复的。我试着去寻找它。但是找不到它。我在搜索vi和unixshell。也许你们应该在答案中添加标签,并在其中包含答案的vi版本!awk'{a=$2;$2=$3;$3=a}1'很酷。谢谢。要使它在
vi
中工作,只需使用
调用它:%,,是的,它很有效。将在接下来的4分钟内接受答案。