使用grep扩展一系列数字

时间:2015-03-10 10:00:49

标签: shell grep

我在电信公司工作,经常需要扩大号码范围。

例如,6121234567X [注意X之前有10个数字]是简写:

61212345670
61212345671
61212345672....... etc (a 10 number range)

612123456X [请注意,X之前只有9个数字]是

的简写
61212345600
61212345601....... etc (a 100 number range)

所以我需要一个grep命令......

  • 读取X前面一行中的字符数(以确定多少后缀)
  • 使用升序后缀
  • 写入适当数量的行(10,100或100)
  • 希望删除原始行

3 个答案:

答案 0 :(得分:0)

您可以很快地在awk中执行此操作:

awk -v val=$a -v max=10
    'BEGIN {
            gsub("X","",val)
            items=max - length(val)
            for (i=0; i<=10^items; i++)
                print val*(10^items)+i
           }'

这是一个例子。要从文件中执行相同的阅读,您只需要使用$1(字段的第一个字段)而不是val,并将所有代码从BEGIN移到主要块中。

解释

  • -v val=$a -v max=10传递参数:$a是包含12345678X表单上字符串的变量,而max包含该数字将包含的最大位数(10情况)。
  • BEGIN {}执行所有这些操作[之前/之后]读取文件。
  • gsub("X","",val)X移除val
  • items=max - length(val)计算不带X的变量大小。
  • for (i=0; i<=10^items; i++) print val*(10^items)+i0循环到10 ^ remaining_size。这意味着从0到10或从0到100 ......取决于没有X的10尺寸的结果。

测试

最多9个:

$ a=12345678X
$ awk -v val=$a -v max=9 'BEGIN {gsub("X","",val); items=max - length(val); for (i=0; i<=10^items; i++) print val*(10^items)+i}'
123456780
123456781
123456782
123456783
123456784
123456785
123456786
123456787
123456788
123456789
123456790

答案 1 :(得分:0)

下面是执行此操作的Python脚本,file-name是预期的第一个参数。用法示例:python script.py file.in > file.out

#!/usr/bin/env python
import sys

def generate(pattern):
    p = pattern.lower().find('x')
    ret = ""
    for i in range(10**(10-p+1)):
        ret += pattern[:p] + str(i).zfill(10-p+1) + " "
    return ret

if __name__ == "__main__":
    if len(sys.argv) <= 1:
        print("Filename needed!")
    else:
        with open(sys.argv[1]) as f:
            for ln in f:
                print(generate(ln.rstrip()))

答案 2 :(得分:0)

 echo 6121234567X |    perl -nE 'm/(.*)X/;  
       say $1. $_ foreach (0..10**(11-length $1)-1)'
    61212345670
    61212345671
    61212345672
    61212345673
    61212345674
    61212345675
    61212345676
    61212345677
    61212345678
    61212345679

获得零填充格式有点丑陋:

echo 611234567X |  perl -wne 'm/(.*)X/; $b=$1; $r=11 - length $b;  
     $fmt="%0" . $r . "s\n";
     printf "$b$fmt", $_ foreach (0..10**$r-1) '