【问题标题】:add first entry into next line and shift data after comma & underscore from previous line to the next line将第一个条目添加到下一行并将逗号和下划线后的数据从上一行移到下一行
【发布时间】:2017-11-05 00:01:10
【问题描述】:

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

样本数据:

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

有办法吗?

【问题讨论】:

  • 使用 bash:while IFS="|,_" read -r -a col; do for ((i=1; i<${#col[@]}; i++)); do echo "${col[0]}|${col[$i]}"; done; done < file

标签: python bash shell unix awk


【解决方案1】:

这可能对你有用(GNU sed):

sed -r 's/((.*)\|[^_,]*)[_,]/\1\n\2|/;l;P;D' file

将第一个 _, 替换为前两个字段,后两个字段用换行符分隔。打印第一行,然后重复该过程,直到模式空间上的所有字段都被计算在内。

【讨论】:

    【解决方案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设置为输入记录中的字段总数。

    【讨论】:

      【解决方案3】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多