检查号码前缀

时间:2015-06-30 07:46:37

标签: shell unix awk grep

我的剧本中有些麻烦。

我目前正在使用:

 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

file2的

 9855892588
 985589259
 8265
 76543210

我使用下面的两个文件(file1和file2)获取输出:

 5000000000009855892590xxxx xxx
 5000000000000068582654xxxx xxx
 5000000000000765432100xxxx xxx

但我的预期输出只是:

5000000000009855892590xxxx xxx
5000000000000765432100xxxx xxx

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

1 个答案:

答案 0 :(得分:2)

这适用于您的示例,但由于我并不确定您是如何确定有效的,因此它可能不是很强大。

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)中创建一个包含所有第一个字段的数组,然后在第二个文件中匹配我猜到的字符串是您的有效字符串。接下来,如果字符串已保存在数组中,则会打印该行。

不是gawk版

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完成后删除行的开头,接下来为每个保存的元素,检查新创建的行是否以它开头。