Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 删除仅包含卡详细信息的行_Linux_Unix_Awk_Sed_Grep - Fatal编程技术网

Linux 删除仅包含卡详细信息的行

Linux 删除仅包含卡详细信息的行,linux,unix,awk,sed,grep,Linux,Unix,Awk,Sed,Grep,输入文件: SNO|PRODUCT|SUMMARY | ADDRESS|DATE| 101|111111|This cutomer is good|Adress1|01/01/2012| 101|111111|This cutomer contact is 223 456 7777|Adress1|01/01/2012| 101|111111|This cutomer is details 4450 2214 2254 2133|Adress1|01/01/2012

输入文件:

SNO|PRODUCT|SUMMARY              | ADDRESS|DATE|  
101|111111|This cutomer is good|Adress1|01/01/2012|
101|111111|This cutomer contact is 223 456 7777|Adress1|01/01/2012|
101|111111|This cutomer is details 4450 2214 2254 2133|Adress1|01/01/2012|
101|111111|This cutomer is phone number is 223 124 4411|Adress1|01/01/2012|
101|111111|This cutomer is card 1245-2355-4452-1214-152|Adress1|01/01/2012|
101|111111|This cutomer is credit number 1245 2355 4452 1214 152|Adress1|01/01/2012|
预期输出\u文件:

SNO|PRODUCT|SUMMARY              | ADDRESS|DATE|
101|111111|This cutomer is good|Adress1|01/01/2012|
101|111131|This cutomer contact is 223 456 7777|Adress1|01/01/2012|
101|111141|This cutomer is phone number is 223 124 4411|Adress1|01/01/2012|
删除包含卡详细信息的记录。这可以出现在摘要列的任何位置

要检查的条件是:

  • 电话号码为10位数字,因此不能删除
  • 要删除的连续数字超过10位
  • 需要删除带有中间空格、连字符或其他特殊字符的超过10位的连续数字
  • 我试过这样的逻辑:

    首先将数字分组为

  • sed's/\([0-9]\)\([0-9]\)/\1\2/g'输入文件
    -删除数字中的空格
  • sed的/\([0-9]\)-\([0-9]\)/\1\2/g'输入文件
    -删除数字之间的连字符
  • 结果:达到了预期的结果

    SNO|PRODUCT|SUMMARY              | ADDRESS|DATE|     
    101|111111|This cutomer is good|Adress1|01/01/2012|
    101|111111|This cutomer contact is 2234567777|Adress1|01/01/2012|
    101|111111|This cutomer is details 445022142254 2133|Adress1|01/01/2012|
    101|111111|This cutomer is phone number is 2231244411|Adress1|01/01/2012|
    101|111111|This cutomer is card 1245235544521214152|Adress1|01/01/2012|
    101|111111|This cutomer is credit number 1245235544521214152|Adress1|01/01/2012|
    
    现在我需要删除编号大于9,99,99,99999的行,以便只删除带有卡号的行

    无法在摘要列中对大于进行此检查


    有什么帮助吗?

    我建议使用awk而不是sed,因为它可以更容易地将流程分成多个步骤。以下是生成所需输出的awk脚本:

    # set field separator to |
    BEGIN { FS = "|" }
    
    {
        # save third field
        summary = $3
        # remove everything not a digit from the start
        sub(/^[^0-9]+/, "", summary)
        # remove hyphens and spaces from what is left
        gsub(/[- ]/, "", summary)
        # print the whole record unless the number is too long
        if (length(summary) <= 10) print;
    }
    
    顺便说一句,是顾客,不是顾客:)


    不清楚您所说的“特殊字符”是什么意思,所以我在上面假设您指的是非字母字符。

    开始仔细阅读。这是值得你花时间的。您的问题目前已脱离主题,您没有显示您尝试过的代码。Stack Overflow是一个关于编程问题的网站,但我们不会为您完成所有工作。请告诉我们您尝试过什么,您期望发生什么,以及实际发生了什么。@Byte仓鼠我可以从修订历史中看出,这个问题一开始有点混乱,但我认为输入、预期输出和尝试现在都显示出来了。事实上,我想说这比我在这些标签上看到的很多问题都要清楚@Basile我认为问题的形式比你发表评论时要好得多(尽管我仍然同意OP应该在学习awk上投入一些时间)。提出一个更好的相同输入/输出集-一个包含不同“特殊字符”的案例,一个摘要部分中的多个数字,重复的“特殊字符”在数字之间,等等。你知道——你可以想象的东西可能发生在你的真实输入中,但用工具很难处理。根据您当前的输入,您将得到适用于特定输入集的答案,但不适用于您的真实数据,并且您可能很难确定这些答案是什么。如果摘要中出现其他数字,则可能会失败。例如,如果第二个非页眉输入行的摘要字段以
    此第二个客户联系人…
    开头,而不是仅以
    此客户联系人…
    开头,请尝试此操作。除了
    -
    之外,它也没有考虑OP所指的任何其他“特殊字符”。当然,我只是让它适用于示例中显示的输入。是的,不幸的是,示例通常不是很全面,甚至没有涵盖问题文本中提到的情况。
    $ cat file
    SNO|PRODUCT|SUMMARY              | ADDRESS|DATE|  
    101|111111|This cutomer is good|Adress1|01/01/2012|
    101|111111|This cutomer contact is 223 456 7777|Adress1|01/01/2012|
    101|111111|This cutomer is details 4450 2214 2254 2133|Adress1|01/01/2012|
    101|111111|This cutomer is phone number is 223 124 4411|Adress1|01/01/2012|
    101|111111|This cutomer is card 1245-2355-4452-1214-152|Adress1|01/01/2012|
    101|111111|This cutomer is credit number 1245 2355 4452 1214 152|Adress1|01/01/2012|
    $ awk -f script.awk file
    SNO|PRODUCT|SUMMARY              | ADDRESS|DATE|  
    101|111111|This cutomer is good|Adress1|01/01/2012|
    101|111111|This cutomer contact is 223 456 7777|Adress1|01/01/2012|
    101|111111|This cutomer is phone number is 223 124 4411|Adress1|01/01/2012|
    
    $ cat tst.awk
    BEGIN { FS="|" }
    {
        maxLgth = 0
        tail = $0
        while ( match(tail,/[0-9]([0-9]|[^[:alpha:]])+[0-9]/) ) {
            cur = substr(tail,RSTART,RLENGTH)
            gsub(/[^0-9]/,"",cur)
            curLgth = length(cur)
            maxLgth = (curLgth > maxLgth ? curLgth : maxLgth)
            tail = substr(tail,RSTART+RLENGTH)
        }
    }
    maxLgth > 10
    
    $ awk -f tst.awk file
    101|111111|This cutomer is details 4450 2214 2254 2133|Adress1|01/01/2012|
    101|111111|This cutomer is card 1245-2355-4452-1214-152|Adress1|01/01/2012|
    101|111111|This cutomer is credit number 1245 2355 4452 1214 152|Adress1|01/01/2012|