使用awk比较连续行中的字符串

使用awk比较连续行中的字符串,awk,Awk,我有一个有行的文件 apple apple mango mango mango cherry cherry cherry cherry 我想获得当前行中的字符串与下一行中的字符串不同的行号,例如: 2 apple 5 mango 9 cherry 我正在使用此命令,但该命令对我无效: awk '{if ($1!=next);{ print}; next=$1}' file > file.ends 这里有什么错误?这里有一个awk awk '$0!=f && NR&g

我有一个有行的文件

apple
apple
mango
mango
mango
cherry
cherry
cherry
cherry
我想获得当前行中的字符串与下一行中的字符串不同的行号,例如:

2 apple
5 mango 
9 cherry
我正在使用此命令,但该命令对我无效:

awk '{if ($1!=next);{ print}; next=$1}' file > file.ends

这里有什么错误?

这里有一个
awk

awk '$0!=f && NR>1 {print (NR-1),f} {f=$0} END {print NR,$0}' file
2 apple
5 mango
9 cherry
测试行与上一行不同,然后打印上一行号
NR-1
和上一行数据
f


END
用于获取最后一个
NR>1
用于防止第一行受到攻击。

@Jotne的答案为您的问题提供了一个优雅的解决方案

至于你的方法不起作用的原因:

  • next
    是一个保留字,表示“跳过输入行上的剩余模式”,即:继续下一个输入行,忽略
    awk
    程序中的后续模式动作对
  • 除了非法变量名之外,
    next
    是一个误称:它包含前一行,因此更好的名称应该是
    prev
  • 如果语句错误地以
    结尾,则您的
    ,导致后续块始终执行
    {print}
  • 您缺少行索引的输出,并且正在打印当前行(只需说
    print
    ),即使您应该打印上一行
  • 您没有处理最后一个输入行,根据定义,它的下一行(不存在)总是与最后一行不同
您的命令的固定版本如下所示(嗯……当我看到这一点时,我意识到这与@Jotne的解决方案非常接近——值得称赞;我希望我的评论提供一些附加值):


谢谢你们所有人的回复,这对我帮助很大…awk真的很糟糕..你们也。。
awk '
    # Starting with the 2nd line, compare the current line with the previous one
    # and, if it differs, print the *previous* line along with its line index.
  NR>1 && $0 != prev { print NR-1, prev }
    # Save the current line for the next iteration.
  {prev=$0} 
    # Output the final line, whose following - non-existent - line is by
    # by definition always different.
  END { print NR, $0 }
  ' file