Unix:带分隔符的分割线

时间:2019-06-28 08:17:25

标签: unix split cut

我有一个像这样的文件

a   b   c,d
e   f   g
x   y   r,s,t

,我想使用“,”作为分隔符来分隔其列。其他列应复制。

预期结果:

a   b   c
a   b   d
e   f   g
x   y   r  
x   y   s
x   y   t

谢谢

1 个答案:

答案 0 :(得分:0)

使用awk。期望字段分隔符为空格或制表符:

$ awk '{
    split($3,a,",")                   # split the third field on commas, hash to a
    for(i in a) {                     # for all entries in a
        sub(/[^ \t]+$/,a[i],$0)       # replace last field with entries in a...
        print                         # ... preserving separators, space or tab 
    }
}' file
a   b   c
a   b   d
e   f   g
x   y   r
x   y   s
x   y   t

由于使用sub(),如果&中有$3,将产生错误的结果。另外,如注释中所述,使用for(i in a)可能会导致记录输出看起来似乎是随机的。如果有问题,请使用:

$ awk '{
    n=split($3,a,",")                 # store element count to n
    for(i=1;i<=n;i++) {               # iterate in order
        sub(/[^ \t]+$/,a[i],$0)
        print
    }
}' file

对于制表符分隔的文件:

$ awk '
BEGIN { OFS="\t" }                    # output field separator
{
    n=split($3,a,",")
    for(i=1;i<=n;i++) {
        $3=a[i]                       # & friendly version
        print
    }
}' file