【问题标题】:Checking number prefix检查号码前缀
【发布时间】:2015-06-30 07:46:36
【问题描述】:

我的脚本有问题。

我目前正在使用:

 awk '{anum=substr($1,3,22); sub(/^0+/, "", anum); print anum}' file1 | grep -nf file2 | cut -d: -f1 | awk 'FNR==NR{a[$1];next};FNR in a' - file1

文件1

 5000000000009855892590xxxx xxx
 5000000000000068582654xxxx xxx
 5000000000009855892580xxxx xxx
 5000000000000765432100xxxx xxx

文件2

 9855892588
 985589259
 8265
 76543210

我正在使用以下两个文件(file1 和 file2)获取输出:

 5000000000009855892590xxxx xxx
 5000000000000068582654xxxx xxx
 5000000000000765432100xxxx xxx

但我的预期输出只是:

5000000000009855892590xxxx xxx
5000000000000765432100xxxx xxx

我的问题是它在 5000000000000068582654xxxx 中间捕获了 8265,这是错误的。我还能用什么来代替 grep -nf 来满足我的条件? file2 中的数字是否与 file1 的第 3 到 22 位的前缀或整数匹配(无前导零)。

【问题讨论】:

  • 为什么 9765432100 有一个前导 9 匹配?
  • 我的错。已经更新了我的问题
  • 第一个文件似乎没有任何一致性,你如何决定哪些数字是允许的?
  • 只是想检查这个 985589259 (file2) 是否匹配或者是 9855892590 (file1)的前缀
  • 是的,但 765432100 的前导 0 比该行多

标签: shell unix awk grep


【解决方案1】:

这将适用于您的示例,但由于我不确定您如何确定什么是有效的,所以它可能不是很健壮。

gawk 'NR==FNR{a[$1]=$1;next}{match($0,/0+([1-9][0-9]+)0/,b)}a[b[1]]' file{2,1}

 5000000000009855892590xxxx xxx
 5000000000000765432100xxxx xxx

它在第一个文件(file2)中创建一个包含所有第一个字段的数组,然后在第二个文件中匹配我猜想是您的有效字符串的字符串。接下来,如果字符串已保存在数组中,它会打印该行。

不是傻瓜版

awk 'NR==FNR{a[$1]=$1;next}{n=substr($1,3,22);sub(/^0+/, "", n)
     for(i in a)if(n~"^"a[i])print}' test2 test

与另一个开始相同,然后像OP一样删除行的开头,接下来为每个保存的元素检查新创建的行是否以它开头。

【讨论】:

  • @newbie,以什么方式?想象一下有人对你说,我有什么办法可以从你的评论中知道问题出在哪里?
  • 我的意思是 gawk 不受支持,没有安装在我的操作系统中,抱歉让您感到困惑
  • 它有效!谢谢!顺便说一句,你能向我解释一下if(n~"^"a[i])吗?
  • @newbie if n(截断的行)~(包含)"^"(行的开头)a[i](无论a[i]中包含什么。所以我只是检查该行以a[i] 中元素的值开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2015-01-05
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多