如何轻松地用连字符替换重复的部分来扩展数字列表?

如何轻松地用连字符替换重复的部分来扩展数字列表?

注意力!我已经更改了正则表达式和示例数据,因此某些答案可能是错误的!如果这样做是不好的做法,我深表歉意。

我使用 grep(在线工具)提取数据列表,其中重复部分有时用连字符(-o 标志)替换。数字始终为 8 位数字。使用的这些正则表达式之后可能还有更多 8 位数字:[0-9]{8}(, -[0-9]*)*(, [0-9]{8})* 下面的示例数据:

33520470
33520850, -60, -70, -80, -90, 33630077
25453810
13815206, -07, -08, 60682651, 60709994
13340820
61040146, -55
60819060, -79
60819088

我想要的输出是:

33520470
33520850
33520860
33520870
33520880
33520890
33630077
25453810
13815206
13815207
13815208
60682651
60709994
13340820
61040146
61040155
60819060
60819079
60819088

这可以用 grep 完成吗?如果没有,你能建议任何unix或其他工具来实现这个结果吗?我在想 sed 或 awk。

编辑:这已经解决了。为了方便起见,我将在此处包含正确的命令,以便不必仔细阅读注释:

-F ', ' '{ print $1; for(a=2;a <= NF; a ++){ if(length($a) <= 7){ printf("%s%s\n",substr($1,1,length($1)-(length($a)-1)),substr($a, 2))} else { print $a } } }'

答案1

我用 awk 尝试过:

cat file | awk -F ', ' '{ print $1; for(a=2;a <= NF; a ++){printf("%s%s\n",substr($1,1,length($1)-(length($a)-1)),substr($a, 2)) } }'

输出:

33520470
33520850
33520860
33520870
33520880
33520890
25453810
13340820
61040146
61040155
60819060
60819079
60819088

编辑:

获得正确结果的代码:

cat file | awk -F ', ' '{ print $1; for(a=2;a <= NF; a ++){ if(length($a) <= 3){ printf("%s%s\n",substr($1,1,length($1)-(length($a)-1)),substr($a, 2))} else { print $a } } }'

结果:

33520470
33520850
33520860
33520870
33520880
33520890
33630077
25453810
13815206
13815207
13815208
60682651
60709994
13340820
61040146
61040155
60819060
60819079
60819088

答案2

更新使用预处理步骤来处理修改后的输入。

这个答案的其余部分假设数据已经过预处理

grep -oE '[0-9]{8}(, -[0-9]+)*'

即,完整的解决方案需要

grep -oE ... file | awk ...

BEGIN { FS = ", *" }

{
    print $1
    for (i = 2; i <= NF; ++i)
        print substr($1, 1, length($1) - length($i) + 1) substr($i, 2)
}

awk脚本读取一行,然后打印第一个逗号分隔字段。然后,它循环遍历剩余字段并输出第一个字段,并在末尾截断足够的字符,以便-在其他字段中的后面插入字符。

该代码允许可变长度的“后缀”。

测试:

$ awk -f script.awk file
33520470
33520850
33520860
33520870
33520880
33520890
25453810
13340820
61040146
61040155
60819060
60819079
60819088

另一个例子:

$ cat file
1111
2222,-3,-4, -33,-44, -333,-444
$ awk -f script.awk file
1111
2222
2223
2224
2233
2244
2333
2444

作为“一行”:

awk -F ', *' '{print $1; for(i=2;i<=NF;++i)print substr($1,1,length($1)-length($i)+1)substr($i,2)}' file

相关内容