如果行与上一行不匹配,如何使用awk打印计数器+1

时间:2018-10-29 20:32:01

标签: bash

我一直在bash中尝试根据输入文件打印文本。 我的文件包含以下文本:

a
a
a
b
c
c
c
d
d
e
e

对于与上一行不匹配的每一行,我想在计数器上加1并在原始条目旁边打印该计数器。对于相等的行,我想按原样打印计数器,如下所示:

a 1  
a 1  
a 1  
b 2  
c 3  
c 3  
c 3  
d 4  
d 4  
e 5  
e 5   

我已经尝试过下面的代码,但这仅向我提供与前几行相同的信息,而不会显示计数器。

f=a
counter=1

awk '{ 
if ($0==f && NR>1) {print f, counter} {f=$0} ; 
next
elif ($0!=f && NR>1) 
{print f, ++counter} {f=$0}
}' file.txt

输出:

a   
a   
c   
c   
d   
e   

1 个答案:

答案 0 :(得分:0)

这就是您所需要的

awk '
    $1 != prev {c++; prev=$1} 
    {print $0, c}
' file

在文件的第一行,prevc均未定义。 $1 != prev测试为真。在算术上下文中,awk将未定义的c视为数字零,因此++运算符将c正确设置为1。

您在哪里出错了:

  • 期望能够共享shell和awk变量。你不能那样
  • if命令的
  • 语法:大括号太多。

这是对您的代码进行重组,以使其起作用:

awk -v f=a -v counter=1 '{
    if ($0==f && NR>1) {print f, counter; f=$0 ; next}
    if ($0!=f && NR>1) {print f, ++counter; f=$0}
}' file

但是它是以非惯用的方式编写的,并且非常重复。另外,您需要知道文件的第一行。