将连续行中的字符串与awk进行比较

时间:2014-04-10 20:18:49

标签: 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

这里的错误是什么?

2 个答案:

答案 0 :(得分:1)

这是一个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用于防止第一行受到攻击。

答案 1 :(得分:1)

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

至于为什么你的方法不起作用:

  • next是一个保留字,表示"跳过输入行上的剩余模式",即:继续到下一个输入行,忽略{{1}中的后续模式 - 动作对程序。
  • 除了是非法变量名称之外,awk是用词不当:它包含之前的行,因此更好的名称将是next,例如。
  • 您的prev语句被if错误地终止,导致后续的阻止,;总是被执行。
  • 即使您要打印< em>上一个一个。
  • 您没有处理 last 输入行,其中 - 不存在 - 下一行按定义总是与最后一行不同。

你的命令的固定版本看起来如下(嗯......当我看到这个时,我意识到这非常接近@Jotne的解决方案 - 值得赞扬;我希望我的评论提供一些附加价值):

{ print}