【问题标题】:Create duplicate line based on maximum number of delimiters in a field根据字段中的最大分隔符数创建重复行
【发布时间】:2017-08-13 19:20:12
【问题描述】:

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

这在 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|

Max Number = 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|

【问题讨论】:

  • 可能有像a3,a4,a5|b|c1,c2,c3,c4|d|1,2,3,4,5|这样的行吗?

标签: unix awk sed split delimiter


【解决方案1】:

假设需要的拆分不超过一次:

$ 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|
  • -E 使用 ERE,一些 sed 版本使用 -r 选项代替
  • ^(([^|]+\|){4}) 前 4 列由 | 分隔
  • (([^,]+,){5}[^,]+) 6 列,由 , 分隔(没有尾随 ,
  • , 第 6 列和第 7 列之间的逗号
  • (.*) 余下一行
  • \1\3|\n\1\5按需拆分


列和最大数量也可以从 shell 变量中传递(bash 的示例)

$ col=5; max=6
$ sed -E "s/^(([^|]+\|){$((col-1))})(([^,]+,){$((max-1))}[^,]+),(.*)/\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|

$ col=5; max=8
$ sed -E "s/^(([^|]+\|){$((col-1))})(([^,]+,){$((max-1))}[^,]+),(.*)/\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,7,8|
a2|b|c|d|9,10|
a3|b|c|d|1,2|

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 2015-03-07
      • 2019-10-07
      • 2012-08-09
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多