我有类似以下问题先前的问题,但有点不同
假设每行有 10 列,共有 100000 行,我想检查每行是否符合以下模式:
如果某一行看起来像这样,我想将其删除
lambda a, b, c, d: a==a and a+1==b and b+1==c and c+1==d and d+1==e
虽然这个解决方案效果很好,但所有解决方案都有效,都遵循相同的逻辑。问题是,假设我有 10 行,该解决方案会删除从 a 到 e 的 5 个连续数字的行,
如果序列从 b 开始到 f,它将保持
我想要一个由循环控制的解决方案,这样我就不必继续添加和删除变量
我的意思是我想删除行中所有大于 3 的序列,
我的意思是,如果行中有 3 个连续的数字,a==a and a+1==b and b+1==c
就保留它们,如果有超过 3 个连续的数字,a==a and a+1==b and b+1==c and c+1==d and so on
则删除它们,无论它们出现在哪里。
我的意思是可能是
a==a and a+1==b and b+1==c and c+1==d
a==a and a+1==a and b+1==c and c+1==d and d+1==e and e+1==f
and so on
所以我宁愿用循环或类似的解决方案来做这件事,这样我就不必写出所有的可能性
像上次一样,出于学习目的,我更喜欢使用 awk 或 perl,一位朋友告诉我 haskell 可以轻松做到这一点,但我没有在 haskell 中找到解决方案,如果这是真的,那么我很好奇想知道如何做到。
请注意,我不介意递归解决方案。当我回家后,我会在几个小时内编辑我的问题以提供输入和输出示例
编辑
示例输入
1,2,3,4,5,6,7,8,9
1,5,8,11,14,16,17,18,19
1,2,3,5,7,9,15,29,34
11,22,25,30,40,55,80,83,90
预期输出
1,2,3,5,7,9,15,29,34
11,22,25,30,40,55,80,83,90
原因:第三行仅包含 3 个连续的数字,第四行不包含连续的数字。应该删除前两行。
答案1
已测试:
awk -F, '{
for (i=1; i<=NF-3; i++)
if ($i+1==$(i+1) && $i+2==$(i+2) && $i+3==$(i+3))
next
print
}' file
答案2
Perl:(在问题中添加示例后重新编辑)
从命令行:
perl -F, -ane'my($a,$b)=$F[0];$b=$b>($l=$a++==$_?$l+1:0)?$b:$l for@F;print if $b>5' \
file.txt
如果要更改文件,请使用-i
命令行版本的标志,或使用 shell 的重定向运算符 ( >
,不要在同一个文件上使用它,因为它会被截断前已读!)。