Vim 如何在不同的列中使用文本编辑器生成行模式

Vim 如何在不同的列中使用文本编辑器生成行模式,vim,awk,sed,Vim,Awk,Sed,我的案文如下: a text is present for a few lines which I dont want to edit 1 2 ab 2 3 ab 3 4 ab 4 5 ab 5 6 7 8 现在我想在第二列中生成数字的升序,并用字符串“ab”填充第三列,如下所示 a text is present for a few lines which I dont want to edit 1 2 ab 2 3 ab 3 4 ab 4 5 ab 5 6 ab 6 7 ab 7

我的案文如下:

a text is present
for a few lines
which I dont want 
to edit 
1 2 ab
2 3 ab
3 4 ab
4 5 ab 
5
6
7
8
现在我想在第二列中生成数字的升序,并用字符串“ab”填充第三列,如下所示

a text is present
for a few lines
which I dont want 
to edit 
1 2 ab
2 3 ab
3 4 ab
4 5 ab
5 6 ab
6 7 ab
7 8 ab
8 9 ab 

这可能是您正在寻找的:

$ awk '{$2=($2?$2:p[2]+1); $3=($3?$3:p[3]); split($0,p)} 1' file
1 2 ab
2 3 ab
3 4 ab
4 5 ab
5 6 ab
6 7 ab
7 8 ab
8 9 ab
鉴于您在第100行开始上述转换的新要求:

awk 'NR>99{$2=($2?$2:p[2]+1); $3=($3?$3:p[3]); split($0,p)} 1' file
awk中的另一个:

$ awk 'NR>5 && NF==1{$2=1+$1;$3="ab"}1' file
a text is present
for a few lines
which I dont want 
to edit 
1 2 ab
2 3 ab
3 4 ab
4 5 ab 
5 6 ab
6 7 ab
7 8 ab
8 9 ab
您可以使用
NR>5
控制起始记录,或者使用vim控制要从哪一行开始。

:g/\d\+\s*$/ %s:\v\d+ (\d+) ab\_s*\d\s*$\zs:\=printf(" %d ab",submatch(1)+1):
在vim中:

qa
  :%s/\v( \d+.+)(\n\d+)$/\1\2\1/
  w<C-a>
  @a
q
@a
qa
:%s/\v(\d++)(\n\d+)$/\1\2\1/
W
@a
Q
@a

这是一个递归宏,它用上一行的第二列和第三列填充只有一列的第一行,然后递增第二列。

Hi,awk命令非常有效。但是,我确实在文本文件的开头有文本,我不想打扰它。也就是说,我希望该命令从特定行(比如说第100行)开始工作。“我怎样才能解决这个问题呢?”Saideppavuluri,请从一开始就把所有的要求都讲给问题听。@James对不起,我弄错了,我不清楚我的案例描述。正如在问题中编辑的,我有我不想更改的文本,并且希望得到你们提到的输出,这些数字在几行之后开始。