【问题标题】:Grouping the rows of a text file based on 2 columns基于 2 列对文本文件的行进行分组
【发布时间】:2013-09-27 22:40:07
【问题描述】:

我有一个这样的文本文件:

1  abc 2
1  rgt 2
1  yhj 2
3  gfk 4
5  kji 6
3  plo 4 
3  vbn 4
5  olk 6

我想根据第一列和第二列对行进行分组,如下所示:

1  abc,rgt,yhj 2
3 gfk,plo,ybn 4
5 kji,olk 6

这样我就可以看到 col2 对特定 col1、col3 的值是多少。 如何使用 shell 脚本做到这一点?

【问题讨论】:

    标签: shell command-line


    【解决方案1】:

    只使用 awk:

    #!/usr/bin/env awk -f
    
    {
        k = $1 "\x1C" $3
        if (k in a2) {
            a2[k] = a2[k] "," $2
        } else {
            a1[k] = $1
            a2[k] = $2
            a3[k] = $3
            b[++i] = k
        }
    }
    END {
        for (j = 1; j <= i; ++j) {
            k = b[j]
            print a1[k], a2[k], a3[k]
        }
    }
    

    一行:

    awk '{k=$1"\x1C"$3;if(k in a2){a2[k]=a2[k]","$2}else{a1[k]=$1;a2[k]=$2;a3[k]=$3;b[++i]=k}}END{for(j=1;j<=i;++j){k=b[j];print a1[k],a2[k],a3[k]}}' file
    

    输出:

    1 abc,rgt,yhj 2
    3 gfk,plo,vbn 4
    5 kji,olk 6
    

    【讨论】:

      【解决方案2】:

      应该这样做:

      awk -F " " '{ a[$1" "$3]=a[$1" "$3]$2","; }END{ for (i in a)print i, a[i]; }' file.txt | sed 's/,$//g' | awk -F " " '{ tmp=$3;$3=$2;$2=tmp;print }' |sort
      

      【讨论】:

        猜你喜欢
        • 2017-03-09
        • 2022-11-16
        • 1970-01-01
        • 2019-06-25
        • 2020-06-13
        • 1970-01-01
        • 2020-03-21
        • 1970-01-01
        • 2021-10-06
        相关资源
        最近更新 更多