将第一个条目添加到下一行并在逗号和&之后移位数据从上一行到下一行的下划线

时间:2017-06-03 20:12:55

标签: python bash shell unix awk

下划线和逗号后的数据将转到下一行,而数据从开始到管道添加到它们之前。

示例数据:

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

有办法吗?

3 个答案:

答案 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

将第一个_,替换为与下两个字段分隔的前两个字段换行。打印第一行然后重复该过程,直到考虑到模式空间上的所有字段。