使用Shell脚本合并csv文件中具有相同值的行

时间:2019-07-15 19:17:14

标签: shell

我有一个如下的csv文件

a,123,xyz
a,345,zyx
b,123,xyz
b,345,zyx

我想将第一列与该行中的相同值合并。像下面一样

a,123,xyz
  345,zyx
b,123,xyz
  345,zyx

我已经对文件进行了排序,并试图对值进行计数,但由于需要在shell脚本中进行操作而无法继续

2 个答案:

答案 0 :(得分:1)

您可以使用以下awk代码段获取所需的输出:

awk -F, '{ if (f == $1) { for (c=0; c <length($1) + length(FS); c++) printf " "; print $2 FS $3 } else { print $0 } } { f = $1 }' FILE

或者只是格式化的awk程序:

{
    if (f == $1) {
        for (c=0; c < length($1) + length(FS); c++)
            printf " "
        print $2 FS $3
    } else {
        print $0
    }
}

{
    f = $1
}

说明:

如果第一字段($1)与上一行(f的第一字段匹配,该字段在处理f = $1的每一行结束时分配),则我们打印字段长度要省略的空格加上字段分隔符(FS)的长度。否则,我们只打印整行($0)。


如果需要保留逗号,则awk程序应为:

{
    if (f == $1) {
        for (c=0; c < length($1); c++)
            printf " "
        print FS $2 FS $3
    } else {
        print $0
    }
}

{
    f = $1
}

这将打印:

a,123,xyz
 ,345,zyx
b,123,xyz
 ,345,zyx

答案 1 :(得分:0)

只需:

awk '$1==p{sub("[^,]*,",s)}
    {p=$1; s = sprintf("%"(1 + length(p))"s","")}1' FS=, OFS=, input

如果您不用担心前导缩进,这会简单得多:

awk '$1==p{sub("[^,]*,","")}{p=$1}1' FS=, OFS=, input