使用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
- 您没有处理最后一个输入行,根据定义,它的下一行(不存在)总是与最后一行不同
谢谢你们所有人的回复,这对我帮助很大…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