将非唯一值与唯一值匹配

时间:2016-04-11 14:11:47

标签: awk sed

我的数据看起来像这样

1   3
1   2
1   9
5   4
4   6
5   6
5   8
5   9
4   2

我希望输出为

  1    3,2,9
  5    4,6,8,9
  4    6,2

这只是示例数据,但我原来的数据有更多的值。

3 个答案:

答案 0 :(得分:1)

所以这很有用

所以这基本上创建了一个哈希表,使用第一列作为键,第二列作为值:

awk '{line="";for (i = 2; i <= NF; i++) line = line $i ", "; table[$1]=table[$1] line;} END {for (key in table) print key " => " table[key];}' trial.txt

输出

 4 => 6, 2
 5 => 4, 6, 8, 9 
 1 => 3, 2, 9

答案 1 :(得分:0)

我会写

awk -v OFS=, '
    {
        key = $1
        $1 = ""
        values[key] = values[key] $0
    }
    END {
        for (key in values) {
            sub(/^,/, "", values[key])
            print key " " values[key]
        }
    }
' file

如果只想要每个键的唯一值(需要GNU awk用于多维数组)

gawk -v OFS=, '
    { for (i=2; i<=NF; i++) values[$1][$i] = i }
    END {
        for (key in values) {
            printf "%s ", key
            sep = ""
            for (val in values[key]) {
                printf "%s%s", sep, val
                sep = ","
            }
            print ""
        }
    }
' file

或perl

perl  -lane '
    $key = shift @F;
    $values{$key}{$_} = 1 for @F;
} END {
    $, = " ";
    print $_, join(",", keys %{$values{$_}}) for keys %values;
' file

答案 2 :(得分:0)

如果不关心密钥的顺序,我认为这是惯用的awk解决方案。

$ awk '{a[$1]=($1 in a?a[$1]",":"") $2} 
    END{for(k in a) print k,a[k]}' file | 
 column -t

4  6,2
5  4,6,8,9
1  3,2,9