分割线的awk或bash

时间:2016-11-17 10:50:26

标签: bash awk

我想拆分一个看起来像这样的csv文件:

a|b|1,2,3
c|d|4,5
e|f|6,7,8

目标是这种格式:

a|b|1
a|b|2
a|b|3
c|d|4
c|d|5
e|f|6
e|f|7
e|f|8

如何在bash或awk中执行此操作?

4 个答案:

答案 0 :(得分:1)

使用bash:

while IFS="|" read -r a b c; do for n in ${c//,/ }; do echo "$a|$b|$n"; done; done <file

输出:

a|b|1
a|b|2
a|b|3
c|d|4
c|d|5
e|f|6
e|f|7
e|f|8

答案 1 :(得分:0)

$ cat hm.awk
{
    s = $0; p = ""
    while (i = index(s, "|")) { # `p':  up to the last '|'
                                # `s':  the rest
      p = p substr(s, 1    ,  i)
      s =   substr(s, i + 1)
    }
    n = split(s, a, ",")
    for (i = 1; i <= n; i++)
      print p a[i]
}

用法:

awk -f hm.awk file.csv

答案 2 :(得分:0)

在Gnu awk(split)中:

$ awk '{n=split($0,a,"[|,]");for(i=3;i<=n;i++) print a[1] "|" a[2] "|" a[i]}' file

答案 3 :(得分:0)

perl

$ cat ip.csv 
a|b|1,2,3
c|d|4,5
e|f|6,7,8

$ perl -F'\|' -lane 'print join "|", @F[0..1],$_ foreach split /,/,$F[2]' ip.csv
a|b|1
a|b|2
a|b|3
c|d|4
c|d|5
e|f|6
e|f|7
e|f|8
  • |上的输入行拆分为@F数组
  • 然后对于第3列中的每个逗号分隔值,以所需格式打印


对于通用的最后一列,

perl -F'\|' -lane 'print join "|", @F[0..$#F-1],$_ foreach split /,/,$F[-1]' ip.csv