bash - 如果行与前一行不匹配,如何使用 awk 打印 counter+1
问题描述
我一直在 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
是真的。awk 将 undefinedc
视为算术上下文中的数字零,因此++
运算符正确地将 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
但它是以非惯用方式编写的,并且非常重复。另外,您需要知道文件的第一行。
推荐阅读
- angularjs - 如何刷新 AngularJS 组件中的数据以及绑定到其视图模型属性的组件中的数据?
- python - 如何获取特定日期是星期几?
- grails - Grails 分页:如何使用分页
- python - 如何在标记名称中包含感叹号的 XML 文件中查找元素?
- python - 如何将这些数据框与熊猫合并?
- angular - 如何改进此指令以显示带有 mat-error 的自定义错误
- php - 更改服务器并添加通配符 ssl 后对登录连接进行故障排除
- c++ - C++ 停止预处理器宏扩展
- salesforce - 如何在 Einstein Analytics 数据流中的 SOQL 高级筛选器中嵌套日期函数
- spring - Hibnernate/JPA 选择查询中的 Oracle 提示不起作用