如何在Vi文件的每一行末尾附加一些命令输出?

时间:2014-02-07 09:56:25

标签: shell unix vim awk vi

假设我有一个vi文件如下:

cat file1

abc 123 pqr
lmn 234 rst
jkl 100 mon

我想取每行的第二个字段(即,在这种情况下是123,234和100)并将其附加到同一行的末尾。 我该怎么做?

输出应如下所示:

abc 123 pqr 123
lmn 234 rst 234
jkl 100 mon 100

3 个答案:

答案 0 :(得分:3)

使用awk

$ awk '{NF=NF+1; $NF=$2}1' file
abc 123 pqr 123
lmn 234 rst 234
jkl 100 mon 100

它增加一个字段的数量,并将最后一个设置为第二个。然后1是一个真实条件,它被评估为默认的awk行为:{print $0}

或者

awk '{print $0, $2}' file

它打印整行和第二个字段。

甚至更短,thanks Håkon Hægland!

awk '{$(NF+1)=$2}1' file

答案 1 :(得分:1)

你有很多方法可以在Vi(m)中做到这一点。这是我想到的最简单的事情:

:%norm 0f<space>yaw$p

说明:

  • :{range}norm commandcommand
  • 中的每一行执行正常模式{range}
  • %是一个快捷范围,意思是“缓冲区中的所有行”,因此我们将执行缓冲区中每一行的后续内容
  • 0将光标放在当前行的第一列(不是绝对必要但是很好的做法)
  • f<space>将光标跳到当前行上光标后的第一个<space>
  • yaw将单词和光标
  • 下的<space>拉出来
  • $跳到行尾
  • p粘贴之前被取消的文字

答案 2 :(得分:-1)

使用mark提示,你可以在vi

中完成
:%s/\( [^ ]*\)\(.*\)/\1\2\1/

另一种方法,使用sed

sed -r 's/( [^ ]*)(.*)/\1\2\1/' file