shell脚本:如何根据每行中的第一个字段/元素对行进行分组

时间:2014-04-08 16:52:46

标签: linux bash shell

我有一个包含以下行的文件:

1 24 4
1 2 3
1 5 9
2 1 8
2 3 4

我想使用shell脚本按行中的第一个元素对这些行进行分组。例如,我们有3行第一个元素' 1'然后我想放第二个元素,即" 24,2 5"与同一行中的第一个元素一起,分组结果为:

1 24 2 5
2 1 3

如何使用shell脚本执行此操作?谢谢!

2 个答案:

答案 0 :(得分:0)

使用awk:

awk '!a[$1]{b[++p]=$1; a[$1]=$2;next} {a[$1]=sprintf("%s%s%s", a[$1], OFS, $2)}
      END {for (i=1; i<=p; i++) print b[i], a[b[i]]}' file
1 24 2 5
2 1 3

答案 1 :(得分:0)

如果您的输入是根据第一列进行排序的,那么您可以打印第1列填充第2列,因为它们会发生变化。类似的东西:

awk '
$1!=fld1 && NR>1{
    print fld1, fld2
    fld1 = $1; fld2 = $2
    next
}
{
    fld1 = $1; 
    fld2 = ((fld2) ? fld2 FS $2 : $2)
}
END{print fld1, fld2}' file
1 24 2 5
2 1 3

如果您的输入是随机的,那么最好将值存储在数组中。

awk '{a[$1] = ((a[$1]) ? a[$1] FS $2 : $2)}
END{for(x in a) print x,a[x]}' file 
1 24 2 5
2 1 3