循环遍历 csv,删除模式

循环遍历 csv,删除模式

我有类似以下问题先前的问题,但有点不同

假设每行有 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 的重定向运算符 ( >,不要在同一个文件上使用它,因为它会被截断已读!)。

相关内容