根据字段中的最大分隔符数创建重复行

时间:2017-03-21 21:48:35

标签: unix awk sed split delimiter

我有一个包含多个字段和两种分隔符的文件。如果其中一个字段中的分隔符数量达到了定义的数量,那么我希望在复制该行的第一部分后,在满足该数字后将该字段拆分到下一行。

在awk或sed中这可能吗?

实施例

输入

a1|b|c|d|1,2,3,4|
a2|b|c|d|1,2,3,4,5,6,7,8,9,10|
a3|b|c|d|1,2|

最大数量= 6,在字段5中用逗号分隔

输出

a1|b|c|d|1,2,3,4|
a2|b|c|d|1,2,3,4,5,6|
a2|b|c|d|7,8,9,10|
a3|b|c|d|1,2|

2 个答案:

答案 0 :(得分:0)

awk救援!

awk -F\| -v OFS=\| -v c=',' '
     {n=split($5,a,c); 
      if(n>6) 
        {f=$5; 
         $5=a[1] c a[2] c a[3] c a[4] c a[5] c a[6]; 
         print; 
         $5=f; 
         gsub(/([^,]+,){6}/,"",$5)}}1' file

答案 1 :(得分:0)

假设不需要多次拆分:

NoneType
  • $ sed -E 's/^(([^|]+\|){4})(([^,]+,){5}[^,]+),(.*)/\1\3|\n\1\5/' ip.txt a1|b|c|d|1,2,3,4| a2|b|c|d|1,2,3,4,5,6| a2|b|c|d|7,8,9,10| a3|b|c|d|1,2| 使用ERE,某些-E版本使用sed选项
  • -r前4列由^(([^|]+\|){4})
  • 分隔
  • |(([^,]+,){5}[^,]+)分隔的6列(不含尾随,
  • ,第6列和第7列之间的逗号
  • ,其余部分
  • (.*)根据需要拆分


列和最大数也可以从shell变量传递(示例显示为\1\3|\n\1\5

bash