假设我有一个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
答案 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 command
在command
{range}
%
是一个快捷范围,意思是“缓冲区中的所有行”,因此我们将执行缓冲区中每一行的后续内容0
将光标放在当前行的第一列(不是绝对必要但是很好的做法)f<space>
将光标跳到当前行上光标后的第一个<space>
yaw
将单词和光标<space>
拉出来
$
跳到行尾p
粘贴之前被取消的文字答案 2 :(得分:-1)
使用mark提示,你可以在vi
中完成:%s/\( [^ ]*\)\(.*\)/\1\2\1/
另一种方法,使用sed
sed -r 's/( [^ ]*)(.*)/\1\2\1/' file