下划线和逗号后的数据将转到下一行,而数据从开始到管道添加到它们之前。
示例数据:
1.2.4.0/24|24151_24409_24406
37.99.128.0/19|47794_47795,48695
37.142.128.0/17|21450,65555
预期结果应为:
1.2.4.0/24|24151
1.2.4.0/24|24409
1.2.4.0/24|24406
37.99.128.0/19|47794
37.99.128.0/19|47795
37.99.128.0/19|48695
37.142.128.0/17|21450
37.142.128.0/17|65555
有办法吗?
答案 0 :(得分:2)
使用awk:
awk -F '[|,_]' '{for (i=2; i<=NF; i++) print $1 "|" $i}' file
输出:
1.2.4.0/24|24151 1.2.4.0/24|24409 1.2.4.0/24|24406 37.99.128.0/19|47794 37.99.128.0/19|47795 37.99.128.0/19|48695 37.142.128.0/17|21450 37.142.128.0/17|65555
变量NF
设置为输入记录中的字段总数。
答案 1 :(得分:0)
gawk 解决方案:
awk -F'|' '{ n=split($2,a,/[_,]/); for(i=1;i<=n;i++) print $1,a[i] }' OFS='|' file
输出:
1.2.4.0/24|24151
1.2.4.0/24|24409
1.2.4.0/24|24406
37.99.128.0/19|47794
37.99.128.0/19|47795
37.99.128.0/19|48695
37.142.128.0/17|21450
37.142.128.0/17|65555
split($2,a,/[_,]/)
- 将第二个字段值划分为由模式/[_,]/
定义的部分,并返回创建的元素数n
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed -r 's/((.*)\|[^_,]*)[_,]/\1\n\2|/;l;P;D' file
将第一个_
或,
替换为与下两个字段分隔的前两个字段换行。打印第一行然后重复该过程,直到考虑到模式空间上的所有字段。