[英]How to use awk to print counter+1 if line does not match previous line
我一直在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
这就是你所需要的
awk '
$1 != prev {c++; prev=$1}
{print $0, c}
' file
在文件的第一行, prev
和c
均未定义。 $1 != prev
测试将为true。 在算术上下文中,awk将未定义的c
视为数字零,因此++
运算符将c正确设置为1。
您出错的两个地方:
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
但是它是以非惯用的方式编写的,并且非常重复。 另外,您需要知道文件的第一行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.