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