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|
删除包含卡详细信息的记录。这可以出现在摘要列的任何位置
要检查的条件是:
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|