【问题标题】:How to use awk to print counter+1 if line does not match previous line如果行与前一行不匹配,如何使用 awk 打印 counter+1
【发布时间】:2018-10-30 04:50:54
【问题描述】:

我一直在 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   

【问题讨论】:

    标签: bash


    【解决方案1】:

    这就是你所需要的

    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
    

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

    【讨论】:

      猜你喜欢
      • 2017-04-30
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 2018-01-09
      相关资源
      最近更新 更多